ระบบที่ทำจะมีการตรวจสอบข้อมูลที่ป้อนเข้ามา โดยบังคับให้ป้อนข้อมูลเข้ามาตามค่าข้อมูลที่มีอยู่ แต่ถ้าจะต้องมา loop เช็กว่าข้อมูลตัวนี้มีในฐานข้อมูลรึเปล่า ก็เสียเวลาและเปลืองทรัพยากร จากการสังเกตข้อมูลจะอยู่เป็นช่วง ๆ เช่น 1 – 5, 8 – 12, 1982 – 2016
ถ้ารู้ช่วงข้อมูล ก็จะตรวจได้ว่าข้อมูลที่ป้อนเข้ามาอยู่ในช่วงที่กำหนดหรือไม่
ไปเจอ Select a range of values ลองแก้ตามได้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | WITH Grouped AS ( -- Identify groups SELECT D.bank_id, grp = D.bank_id - ROW_NUMBER() OVER ( ORDER BY D.bank_id) FROM banks AS D) SELECT STUFF ( ( -- Concatenate items in the current group SELECT [text()] = ',' + CONVERT(varchar(11), G2.bank_id) FROM Grouped AS G2 WHERE G2.grp = Grouped.grp ORDER BY G2.bank_id FOR XML PATH ('') ) -- Remove initial comma , 1, 1, '' ) FROM Grouped GROUP BY Grouped.grp; |
ผลลัพธ์
1,2,3,4,5,6
8,9,10,11,12,13,14
16,17,18,19,20,21,22,23,24,25,26,27,28,29
31,32,33,34,35,36,37,38,39,40
43,44
ได้เป็นกลุ่มก็จริงแต่ อยากได้ id เริ่มต้นถึง id สุดท้ายของแต่ละกลุ่มเท่านั้น ลองแก้มั่ว ๆ ดู
1 2 3 4 5 6 7 8 9 | WITH Grouped AS ( SELECT D.bank_id, grp = D.bank_id - ROW_NUMBER() OVER ( ORDER BY D.bank_id) FROM banks AS D) SELECT MIN(Grouped.bank_id) AS start_id, MAX(Grouped.bank_id) AS end_id FROM Grouped GROUP BY Grouped.grp |
ผลลัพธ์
start_id end_id
———– ———–
1 6
8 14
16 29
31 40
43 44
ได้ตามที่ต้องการเลย
About the author