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