ระบบที่ทำจะมีการตรวจสอบข้อมูลที่ป้อนเข้ามา โดยบังคับให้ป้อนข้อมูลเข้ามาตามค่าข้อมูลที่มีอยู่ แต่ถ้าจะต้องมา 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
ได้ตามที่ต้องการเลย
About the author