Skip to content

ฟังก์ชัน Window ใน SQL อธิบาย

ฟังก์ชัน window ของ SQL ที่ใช้กันทั่วไป พร้อมอนุประโยคที่ควบคุมการทำงาน จัดกลุ่มตามงาน: จัดอันดับแถว มองแถวข้างเคียง รันยอดรวมผ่าน frame และดึงค่าแรกหรือค่าสุดท้าย แต่ละแถวจับคู่ฟังก์ชันกับตัวอย่างหนึ่งบรรทัด

ฟังก์ชัน window คำนวณผลลัพธ์จากแถวที่เกี่ยวข้องกับแถวปัจจุบัน โดยไม่ยุบแถวเหมือนที่ GROUP BY ทำ ฟังก์ชัน window ทุกตัวจบด้วยอนุประโยค OVER ที่กำหนดหน้าต่าง: PARTITION BY จัดกลุ่มแถว ORDER BY เรียงลำดับแถว และ frame ที่ระบุหรือไม่ก็ได้จะกำหนดขอบเขตของชุดเลื่อน เข้าใจ OVER ได้แล้ว ที่เหลือก็แค่คำศัพท์

ตารางอ้างอิง · 27 รายการ
27 of 27 rows
การจัดอันดับ
จำนวนเต็มเรียงตามลำดับที่ไม่ซ้ำกัน ต่อหนึ่งแถวใน windowROW_NUMBER() OVER (ORDER BY total DESC)
อันดับแบบมีช่องว่าง แถวที่ค่าเท่ากันได้อันดับเดียวกันและข้ามเลขถัดไปRANK() OVER (ORDER BY total DESC)
อันดับแบบไม่มีช่องว่าง แถวที่ค่าเท่ากันได้อันดับเดียวกันโดยไม่ข้ามเลขใดDENSE_RANK() OVER (ORDER BY total DESC)
แบ่ง window ที่เรียงแล้วออกเป็น n กลุ่มที่เท่ากันโดยประมาณNTILE(4) OVER (ORDER BY total DESC)
มองแถวข้างเคียง
ค่าจาก n แถวก่อนหน้า ถ้าไม่มีแถวดังกล่าวจะใช้ค่า default แทนLAG(total, 1, 0) OVER (ORDER BY created_at)
ค่าจาก n แถวถัดไป ถ้าไม่มีแถวดังกล่าวจะใช้ค่า default แทนLEAD(total, 1, 0) OVER (ORDER BY created_at)
การรวมค่าบน window
ยอดรวมแบบสะสมหรือราย partition โดยไม่ยุบแถวSUM(total) OVER (ORDER BY created_at)
ค่าเฉลี่ยแบบสะสมหรือราย partitionAVG(total) OVER (PARTITION BY user_id)
จำนวนแถวแบบสะสมหรือราย partitionCOUNT(*) OVER (PARTITION BY user_id)
ค่าต่ำสุดใน window หรือ partitionMIN(total) OVER (PARTITION BY user_id)
ค่าสูงสุดใน window หรือ partitionMAX(total) OVER (PARTITION BY user_id)
SUM พร้อม ORDER BY และ frame ที่เปิดจากจุดเริ่มต้น แต่ละแถวบวกสะสมทุกค่าจนถึงตัวเองSUM(total) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING)
AVG บน frame ที่มี n แถวก่อนและหลังแถวปัจจุบันAVG(total) OVER (ORDER BY created_at ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
ค่าแรก ค่าสุดท้าย และเปอร์เซ็นไทล์
ค่าแรกในลำดับการเรียงของ windowFIRST_VALUE(total) OVER (ORDER BY total DESC)
ค่าสุดท้ายใน frame ถ้าไม่มี UNBOUNDED FOLLOWING เฟรมจะหยุดที่แถวปัจจุบันLAST_VALUE(total) OVER (ORDER BY total ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
ค่าที่แถวลำดับที่ n ของ windowNTH_VALUE(total, 2) OVER (ORDER BY total DESC)
อันดับสัมพัทธ์ของแถว อยู่ในช่วง 0 ถึง 1PERCENT_RANK() OVER (ORDER BY total)
สัดส่วนของแถวที่อยู่ถึงแถวปัจจุบัน ตั้งแต่ 1/n สูงสุดถึง 1CUME_DIST() OVER (ORDER BY total)
อนุประโยค OVER
กำหนด window ที่ทุกฟังก์ชันอ่าน<fn>() OVER (PARTITION BY user_id ORDER BY created_at)
เริ่ม window ใหม่สำหรับแต่ละกลุ่มแถวPARTITION BY user_id
จัดลำดับแถวภายในแต่ละ partitionORDER BY created_at
กำหนดขอบเขตของ frame เลื่อน เช่น จากแถวก่อนหน้าถึงแถวถัดไปROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
กำหนดขอบเขต frame ด้วยค่า ไม่ใช่ตำแหน่งแถว CURRENT ROW รวมแถวที่ค่าเท่ากัน และนี่คือ frame เริ่มต้นเมื่อมี ORDER BYRANGE BETWEEN 100 PRECEDING AND CURRENT ROW
กำหนดขอบเขต frame ด้วยกลุ่มแถวที่ค่าเท่ากันจาก ORDER BYGROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
เอาแถวปัจจุบันออกจาก frame ส่วน EXCLUDE TIES เอาแถวที่ค่าเท่ากันออกแทนROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW
ตั้งชื่อ window ครั้งเดียวต่อหนึ่ง query เพื่อให้หลายอนุประโยค OVER ใช้ซ้ำได้WINDOW w AS (PARTITION BY user_id ORDER BY created_at)
กรองแถวที่ aggregate ของ window อ่าน ก่อนที่ window จะถูกนำมาใช้SUM(total) FILTER (WHERE status = 'paid') OVER (ORDER BY created_at)