ฉันมีตารางที่มีตัวเลขเช่นนี้ (สถานะเป็นได้ทั้งฟรีหรือถูกมอบหมาย)
สถานะหมายเลข id_set ----------------------- 1 000001 ที่มอบหมาย 1 000002 ฟรี 1 000003 มอบหมาย 1 000004 ฟรี 1 000005 ฟรี 1 000006 มอบหมาย 1 000007 มอบหมาย 1 000008 ฟรี 1 000009 ฟรี 1 000010 ฟรี 1 000011 ได้รับมอบหมาย 1 000012 ได้รับมอบหมาย 1 000013 ได้รับมอบหมาย 1 000014 ฟรี 1 000015 ได้รับมอบหมาย
และฉันต้องการค้นหาตัวเลข "n" ติดต่อกันดังนั้นสำหรับ n = 3 แบบสอบถามจะกลับมา
1 000008 ฟรี 1 000009 ฟรี 1 000010 ฟรี
ควรกลับเฉพาะกลุ่มแรกที่เป็นไปได้ของแต่ละ id_set (อันที่จริงมันจะถูกดำเนินการสำหรับ id_set ต่อข้อความค้นหาเท่านั้น)
ฉันกำลังตรวจสอบฟังก์ชั่นของ WINDOW ลองใช้คำค้นหาบางอย่างCOUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING)
แต่นั่นคือทั้งหมดที่ฉันได้รับ :) ฉันไม่สามารถคิดถึงตรรกะวิธีการทำเช่นนั้นใน Postgres
ฉันกำลังคิดเกี่ยวกับการสร้างคอลัมน์เสมือนโดยใช้ฟังก์ชั่น WINDOW นับจำนวนแถวก่อนหน้าสำหรับทุกหมายเลขที่สถานะ = 'ฟรี' จากนั้นเลือกหมายเลขแรกโดยที่การนับมีค่าเท่ากับจำนวน "n" ของฉัน
หรืออาจจัดกลุ่มหมายเลขตามสถานะ แต่จากกลุ่มหนึ่งไปยังอีกกลุ่มหนึ่งเท่านั้นและเลือกกลุ่มที่มีตัวเลขอย่างน้อย "n"
แก้ไข
ฉันพบข้อความค้นหานี้ (และเปลี่ยนมันเล็กน้อย)
WITH q AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY id_set, status ORDER BY number) AS rnd,
ROW_NUMBER() OVER (PARTITION BY id_set ORDER BY number) AS rn
FROM numbers
)
SELECT id_set,
MIN(number) AS first_number,
MAX(number) AS last_number,
status,
COUNT(number) AS numbers_count
FROM q
GROUP BY id_set,
rnd - rn,
status
ORDER BY
first_number
ซึ่งสร้างกลุ่มของหมายเลขฟรี / ที่กำหนด แต่ฉันต้องการให้มีหมายเลขทั้งหมดจากกลุ่มแรกเท่านั้นที่ตรงตามเงื่อนไข