ฟังก์ชันหน้าต่าง (SQL)
ในSQL ฟังก์ชันหน้าต่างหรือฟังก์ชันวิเคราะห์[ 1 ]คือฟังก์ชันที่ใช้ค่าจากแถวเดียวหรือหลายแถวเพื่อส่งคืนค่าสำหรับแต่ละแถว (ซึ่งแตกต่างจากฟังก์ชันรวมที่ส่งคืนค่าเดียวสำหรับหลายแถว) ฟังก์ชันหน้าต่างมีข้อกำหนด OVER ฟังก์ชันใดๆ ที่ไม่มีข้อกำหนด OVER จะไม่ใช่ฟังก์ชันหน้าต่าง แต่เป็นฟังก์ชันรวมหรือฟังก์ชันแถวเดียว (สเกลาร์) [ 2 ]
ตัวอย่าง
ตัวอย่างเช่น นี่คือแบบสอบถามที่ใช้ฟังก์ชันหน้าต่างเพื่อเปรียบเทียบเงินเดือนของพนักงานแต่ละคนกับเงินเดือนเฉลี่ยของแผนก (ตัวอย่างจาก เอกสาร PostgreSQL ): [ 3 ]
SELECT depname , empno , salary , avg ( salary ) OVER ( PARTITION BY depname ) FROM empsalary ;ผลลัพธ์:
ชื่อแผนก | หมายเลขพนักงาน | เงินเดือน | เฉลี่ย ----------+-------+--------+---------------------- พัฒนา | 11 | 5200 | 5020.0000000000000000 พัฒนา | 7 | 4200 | 5020.0000000000000000 พัฒนา | 9 | 4500 | 5020.0000000000000000 พัฒนา | 8 | 6000 | 5020.0000000000000000 พัฒนา | 10 | 5200 | 5020.0000000000000000 บุคลากร | 5 | 3500 | 3700.0000000000000000 บุคลากร | 2 | 3900 | 3700.0000000000000000 ยอดขาย | 3 | 4800 | 4866.6666666666666667 ยอดขาย | 1 | 5000 | 4866.6666666666666667 ยอดขาย | 4 | 4800 | 4866.6666666666666667 (10 แถว)
ข้อความPARTITION BYดังกล่าวจะจัดกลุ่มแถวเป็นพาร์ติชัน และฟังก์ชันจะถูกนำไปใช้กับแต่ละพาร์ติชันแยกกัน หากPARTITION BYละเว้นข้อความดังกล่าว (เช่น ข้อความว่างเปล่า ) ชุดผลลัพธ์OVER()ทั้งหมดจะถูกถือว่าเป็นพาร์ติชันเดียว[ 4 ]สำหรับแบบสอบถามนี้ เงินเดือนเฉลี่ยที่รายงานจะเป็นค่าเฉลี่ยที่คำนวณจากทุกแถว
ฟังก์ชันหน้าต่างจะถูกประเมินหลังจากรวมกลุ่ม (หลังจากGROUP BYข้อความและฟังก์ชันการรวมกลุ่มที่ไม่ใช่หน้าต่าง เช่น) [ 1 ]
ไวยากรณ์
ตามเอกสารของ PostgreSQL ฟังก์ชันหน้าต่างมีไวยากรณ์อย่างใดอย่างหนึ่งดังต่อไปนี้: [ 4 ]
function_name ([ expression [, expression ... ]]) OVER window_name function_name ([ expression [, expression ... ]]) OVER ( window_definition ) function_name ( * ) OVER window_name function_name ( * ) OVER ( window_definition )ไวยากรณ์ ที่window_definitionใช้:
[ ชื่อหน้าต่างที่มีอยู่] [ นิพจน์การแบ่งพาร์ติชัน[, ... ] ] [ นิพจน์ การ เรียงลำดับ[ ASC | DESC | ตัวดำเนินการUSING ] [ ค่าว่าง{ ชื่อแรก| นามสกุล} ] [, ... ] ] [ เงื่อนไขเฟรม]frame_clauseมีไวยากรณ์อย่างใดอย่างหนึ่งดังต่อไปนี้:
{ ช่วง| แถว| กลุ่ม} frame_start [ frame_exclusion ] { ช่วง| แถว| กลุ่ม} ระหว่างframe_start และframe_end [ frame_exclusion ]frame_startและframe_endอาจเป็นUNBOUNDED PRECEDING, offset PRECEDING, CURRENT ROW, offset FOLLOWING, หรือUNBOUNDED FOLLOWINGอาจframe_exclusionเป็นEXCLUDE CURRENT ROW, EXCLUDE GROUP, EXCLUDE TIES, EXCLUDE NO OTHERSหรือ
expressionหมายถึงนิพจน์ใดๆ ที่ไม่มีการเรียกใช้ฟังก์ชันหน้าต่าง
สัญลักษณ์:
- วงเล็บเหลี่ยม [] แสดงถึงข้อความเสริม
- วงเล็บปีกกา {} แสดงถึงชุดตัวเลือกที่เป็นไปได้ที่แตกต่างกัน โดยแต่ละตัวเลือกจะคั่นด้วยเครื่องหมายขีดแนวตั้ง |
ตัวอย่าง
ฟังก์ชันหน้าต่างช่วยให้เข้าถึงข้อมูลในเรคอร์ดก่อนและหลังเรคอร์ดปัจจุบันได้[ 5 ] [ 6 ] [ 7 ] [ 8 ]ฟังก์ชันหน้าต่างจะกำหนดกรอบหรือหน้าต่างของแถวที่มีความยาวที่กำหนดรอบแถวปัจจุบัน และทำการคำนวณกับชุดข้อมูลในหน้าต่าง[ 9 ] [ 10 ]
ชื่อ | ------------ แอรอน| <-- ก่อนหน้า (ไม่จำกัด) อมีเลีย| แอนดรูว์| เจมส์| จิลล์| จอห์นนี่| <-- แถวก่อนหน้าแถวแรก ไมเคิล | <-- แถวปัจจุบัน นิค | <-- แถวถัดไปแรก โอฟีเลีย| แซ็ค | <-- ติดตาม (ไม่จำกัด)
ในตารางด้านบน คำสั่งค้นหาต่อไปนี้จะดึงค่าของหน้าต่างสำหรับแต่ละแถว โดยมีแถวก่อนหน้าหนึ่งแถวและแถวถัดไปหนึ่งแถว:
SELECT LAG ( name , 1 ) OVER ( ORDER BY name ) "prev" , name , LEAD ( name , 1 ) OVER ( ORDER BY name ) "next" FROM people ORDER BY nameผลการค้นหาประกอบด้วยค่าต่อไปนี้:
| ก่อนหน้า | ชื่อ | ถัดไป | |----------|----------|----------| | (null)| แอรอน| อมีเลีย| | แอรอน | อมีเลีย | แอนดรูว์ | อมีเลีย | แอนดรูว์ | เจมส์ | | แอนดรูว์ | เจมส์ | จิลล์ | | เจมส์ | จิล | จอห์นนี่ | | จิลล์ | จอห์นนี่ | ไมเคิล | | จอห์นนี่ | ไมเคิล | นิค | | ไมเคิล | นิค | โอฟีเลีย | | นิค | โอฟีเลีย | แซ็ค | | โอฟีเลีย| แซ็ค| (null)|
ประวัติศาสตร์
ฟังก์ชัน Window ได้ถูกรวมเข้าไว้ใน มาตรฐาน SQL:2003และมีการขยายฟังก์ชันการทำงานในข้อกำหนดเพิ่มเติมในภายหลัง[ 11 ]
มีการเพิ่มการรองรับการใช้งานฐานข้อมูลบางประเภทดังต่อไปนี้:
- Oracle - เวอร์ชัน 8.1.6 ในปี 2000 [ 12 ] [ 13 ]
- PostgreSQL - เวอร์ชัน 8.4 ในปี 2552 [ 14 ]
- MySQL - เวอร์ชัน 8 ในปี 2018 [ 15 ] [ 16 ]
- MariaDB - เวอร์ชัน 10.2 ในปี 2559 [ 17 ]
- SQLite - เวอร์ชัน 3.25.0 ในปี 2018 [ 18 ]