Suppose I have the following table:

start_data | end_date
t1         | Null
Null       | t2
t3         | Null
Null       | t4
t5         | Null

The output should be like this:

start_data | end_date
t1         | t2
t3         | t4
t5         | Null


  • the type of ti is date
  • ti < ti+1 holds true for all values.

pseudo code:
for every record i
xi <--- start_date
yi <--- end_date
zi <---- min(yi) && xi>yi
(xi,zi) should be the output for this record i

Is it solvable using native SQL?

  • Your dataset have no any ordering info. So "first"-"last"-"previous"-"next" terms not exists. So the task is unsolvable.
    – Akina
    Commented Nov 20, 2018 at 17:44
  • @Akina Well I guess one could order by coalesce(start_data, end_date) or the equivalent in the OP's DBMS of choice, which he sadly failed to mention.
    – mustaccio
    Commented Nov 20, 2018 at 17:48

1 Answer 1


I guess one could order by coalesce(start_data, end_date)

WITH cte AS (
SELECT COALESCE(start_data, end_date) dt, 
       ROW_NUMBER() OVER (ORDER BY COALESCE(start_data, end_date)) rn
FROM datatable
SELECT MIN(dt) start_data, MAX(dt) end_date
FROM cte
GROUP BY ROUND((rn-1)/2)

This query is a model. The final text is dependent by DBMS.

Maybe you will need to replace MIN/MAX with CASE WHEN rn%2 = [0|1]

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.