Tag Archive group

Byphunsanit

เลือกช่วงข้อมูล

ระบบที่ทำจะมีการตรวจสอบข้อมูลที่ป้อนเข้ามา โดยบังคับให้ป้อนข้อมูลเข้ามาตามค่าข้อมูลที่มีอยู่ แต่ถ้าจะต้องมา loop เช็กว่าข้อมูลตัวนี้มีในฐานข้อมูลรึเปล่า ก็เสียเวลาและเปลืองทรัพยากร จากการสังเกตข้อมูลจะอยู่เป็นช่วง ๆ เช่น 1 – 5, 8 – 12, 1982 – 2016

ถ้ารู้ช่วงข้อมูล ก็จะตรวจได้ว่าข้อมูลที่ป้อนเข้ามาอยู่ในช่วงที่กำหนดหรือไม่

ไปเจอ Select a range of values ลองแก้ตามได้

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 สุดท้ายของแต่ละกลุ่มเท่านั้น ลองแก้มั่ว ๆ ดู

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

ได้ตามที่ต้องการเลย