I have a table invoices with a field invoice_number. This is what happens when i execute select invoice_number from invoice
| invoice_number |
|---|
| 1 |
| 2 |
| 3 |
| 5 |
| 6 |
| 10 |
| 11 |
I want a SQL that gives me the following result:
| gap_start | gap_end |
|---|---|
| 1 | 3 |
| 5 | 6 |
| 10 | 11 |
Advertisement
Answer
You can use row_number() window function to create a row count and use the difference to your actual values as group criterion:
SELECT
MIN(invoice) AS start,
MAX(invoice) AS end
FROM (
SELECT
*,
invoice - row_number() OVER (ORDER BY invoice) as group_id
FROM t
) s
GROUP BY group_id
ORDER BY start