คำถามติดแท็ก greatest-n-per-group

ใช้สิ่งนี้สำหรับปัญหาที่เกี่ยวข้องกับการส่งคืนแถวอย่างน้อยหนึ่งแถวจากแต่ละกลุ่มในชุดข้อมูล แม้จะมีชื่อ แต่แท็กนี้เหมาะสำหรับคำค้นหา * ขั้นต่ำ * และ * สูงสุด - * ต่อกลุ่ม

6
กำลังดึงข้อมูลแถว n ต่อกลุ่ม
ฉันมักจะต้องเลือกจำนวนแถวจากแต่ละกลุ่มในชุดผลลัพธ์ ตัวอย่างเช่นฉันอาจต้องการแสดงมูลค่าการสั่งซื้อล่าสุด 'n' ที่สูงที่สุดหรือต่ำสุดต่อลูกค้า ในกรณีที่ซับซ้อนมากขึ้นจำนวนแถวที่จะแสดงอาจแตกต่างกันไปในแต่ละกลุ่ม (กำหนดโดยแอตทริบิวต์ของการจัดกลุ่ม / ระเบียนหลัก) ส่วนนี้เป็นทางเลือก / สำหรับเครดิตเพิ่มเติมและไม่ได้มีเจตนาเพื่อห้ามไม่ให้คนตอบรับ ตัวเลือกหลักสำหรับการแก้ไขปัญหาประเภทนี้ใน SQL Server 2005 และรุ่นที่ใหม่กว่าคืออะไร อะไรคือข้อดีและข้อเสียหลักของแต่ละวิธี? ตัวอย่าง AdventureWorks (เพื่อความชัดเจนและเป็นตัวเลือก) แสดงวันที่ล่าสุดของการทำธุรกรรมห้าครั้งและรหัสจากTransactionHistoryตารางสำหรับแต่ละผลิตภัณฑ์ที่เริ่มต้นด้วยตัวอักษรจาก M ถึง R เหมือนกันอีกครั้ง แต่มีnบรรทัดประวัติต่อผลิตภัณฑ์โดยที่nห้าเท่าของDaysToManufactureแอตทริบิวต์ผลิตภัณฑ์ เดียวกันสำหรับกรณีพิเศษที่ว่าเส้นหนึ่งของประวัติศาสตร์ที่ต่อผลิตภัณฑ์เป็นสิ่งจำเป็น (เดี่ยวรายการล่าสุดโดยผูกทำลายบนTransactionDateTransactionID

5
วิธีการเลือกแถวแรกของแต่ละกลุ่ม?
ฉันมีโต๊ะแบบนี้: ID | Val | Kind ---------------------- 1 | 1337 | 2 2 | 1337 | 1 3 | 3 | 4 4 | 3 | 4 ฉันต้องการที่จะทำให้การSELECTที่จะกลับมาเพียงแค่แถวแรกสำหรับแต่ละการสั่งซื้อโดยValKind ตัวอย่างผลลัพธ์: ID | Val | Kind ---------------------- 2 | 1337 | 1 3 | 3 | 4 ฉันจะสร้างแบบสอบถามนี้ได้อย่างไร

6
ฉันจะรับ "แถวที่สอดคล้องกันล่าสุด" อย่างมีประสิทธิภาพได้อย่างไร
ฉันมีรูปแบบแบบสอบถามที่ต้องพบบ่อยมาก แต่ฉันไม่รู้วิธีเขียนแบบสอบถามที่มีประสิทธิภาพ ฉันต้องการค้นหาแถวของตารางที่ตรงกับ "วันที่ล่าสุดไม่หลัง" แถวของตารางอื่น ฉันมีตารางinventoryพูดซึ่งแสดงถึงสินค้าคงคลังที่ฉันถือในวันหนึ่ง date | good | quantity ------------------------------ 2013-08-09 | egg | 5 2013-08-09 | pear | 7 2013-08-02 | egg | 1 2013-08-02 | pear | 2 และโต๊ะ "ราคา" พูดซึ่งถือราคาสินค้าในวันที่กำหนด date | good | price -------------------------- 2013-08-07 | egg | 120 2013-08-06 | pear | …

3
ใน PostgreSQL มีฟังก์ชั่นรวมที่ปลอดภัยชนิดแรก () หรือไม่?
คำถามแบบเต็มเขียนใหม่ ฉันกำลังมองหาฟังก์ชันการรวมครั้งแรก () ที่นี่ฉันพบบางสิ่งที่เกือบจะได้ผล: CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement ) RETURNS anyelement LANGUAGE sql IMMUTABLE STRICT AS $$ SELECT $1; $$; -- And then wrap an aggregate around it CREATE AGGREGATE public.first ( sfunc = public.first_agg, basetype = anyelement, stype = anyelement ); ปัญหาคือเมื่อคอลัมน์ varchar (n) ผ่านฟังก์ชั่นแรก …

3
เลือกวันที่มีวันที่สูงสุดหรือวันที่ล่าสุด
นี่คือสองตาราง SCHOOL_STAFF SCHOOL_CODE + STAFF_TYPE_NAME + LAST_UPDATE_DATE_TIME + PERSON_ID ================================================================= ABE Principal 24-JAN-13 111222 ABE Principal 09-FEB-12 222111 คน PERSON_ID + NAME ================= 111222 ABC 222111 XYZ นี่คือแบบสอบถามออราเคิลของฉัน SELECT MAX(LAST_UPDATE_DATE_TIME) AS LAST_UPDATE, SCHOOL_CODE, PERSON_ID FROM SCHOOL_STAFF WHERE STAFF_TYPE_NAME='Principal' GROUP BY SCHOOL_CODE, PERSON_ID ORDER BY SCHOOL_CODE; ซึ่งให้ผลลัพธ์นี้ LAST_UPDATE SCHOOL_CODE PERSON_ID ===========+===========+========= …

4
วิธีการเลือกแถวแรกจากการเข้าร่วมที่ส่งกลับหลายแถวในคีย์หลัก
สิ่งนี้เกี่ยวข้องกับคำถามนี้: การรวมผลลัพธ์หลาย ๆ ตารางเข้าด้วยกันเป็นแถว ฉันมีสองตารางที่ฉันเข้าร่วม พวกเขาแบ่งปันกุญแจ ตารางบุคคลมีชื่อหนึ่งชื่อต่อคีย์หลัก แต่ตารางอีเมลนั้นมีหลายอีเมลต่อ personId ฉันต้องการแสดงอีเมลแรกต่อคนเท่านั้น ปัจจุบันฉันได้รับหลายแถวต่อคนเพราะพวกเขามีอีเมลหลายฉบับ ฉันใช้ SQL-Server 2005 แก้ไข: นี่คือ T-SQL อีเมลแรกคือแถวอีเมลแรกต่อคน แก้ไข 2: อีเมลแรกที่ฉันเห็นมันจะเป็นแถวอีเมลแรกที่แสดงในการเข้าร่วมเมื่อ SQL ทำงานผ่านการสืบค้น ฉันไม่สำคัญว่าจะแสดงอีเมลใด มีเพียงอีเมลเดียวเท่านั้นที่ปรากฏขึ้น ฉันหวังว่ามันจะชัดเจนยิ่งขึ้น Table1: Person Table2: Email Select Person.PersonName, Email.Email From person left join on Person.ID=Email.PersonId;


2
เคียวรีที่มีประสิทธิภาพเพื่อรับค่าสูงสุดต่อกลุ่มจากตารางขนาดใหญ่
รับตาราง: Column | Type id | integer latitude | numeric(9,6) longitude | numeric(9,6) speed | integer equipment_id | integer created_at | timestamp without time zone Indexes: "geoposition_records_pkey" PRIMARY KEY, btree (id) ตารางมี 20 ล้านบันทึกที่ไม่ได้พูดค่อนข้างมาก แต่มันทำให้การสแกนตามลำดับช้าลง ฉันจะได้รับบันทึกสุดท้ายmax(created_at)ของแต่ละรายการได้equipment_idอย่างไร ฉันได้ลองค้นหาทั้งสองข้อต่อไปนี้โดยมีหลายรุ่นที่ฉันได้อ่านจากคำตอบของหัวข้อนี้: select max(created_at),equipment_id from geoposition_records group by equipment_id; select distinct on (equipment_id) equipment_id,created_at from …

2
วิธีทำให้ DISTINCT ON เร็วขึ้นใน PostgreSQL
ฉันมีตารางstation_logsในฐานข้อมูล PostgreSQL 9.6: Column | Type | ---------------+-----------------------------+ id | bigint | bigserial station_id | integer | not null submitted_at | timestamp without time zone | level_sensor | double precision | Indexes: "station_logs_pkey" PRIMARY KEY, btree (id) "uniq_sid_sat" UNIQUE CONSTRAINT, btree (station_id, submitted_at) ฉันพยายามที่จะได้รับที่ผ่านมาlevel_sensorค่าขึ้นอยู่กับแต่ละsubmitted_at station_idมีประมาณ 400 ที่ไม่ซ้ำกันมีstation_idค่านิยมและรอบ 20k station_idแถวต่อวันต่อ ก่อนสร้างดัชนี: …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.