Home > Enterprise >  SQL Arrange blocks of rows in Order By
SQL Arrange blocks of rows in Order By

Time:04-28

Say I have an original output which looks like this (sorted purely by StartTime):

Name OrderNo OpNo StartTime Length
A 17345 op10 27/4/22 08:00 04:00:00
B 12727 op 20 27/4/22 11:00 02:00:00
A 18001 op10 27/4/22 13:20 01:00:00
B 17345 op 20 28/4/22 10:17 06:00:00
B 18001 op 20 29/4/22 13:00 04:00:00
C 17345 op 30 3/5/22 16:20 08:00:00
C 18001 op 30 5/5/22 13:00 09:00:00

How would it be possible to order the rows by OrderNo, then by OpNo, and then by the StartTime of the lowest OpNo in each OrderNo? So it would look like this:

Name OrderNo OpNo StartTime Length
A 17345 op10 27/4/22 08:00 04:00:00
B 17345 op 20 28/4/22 10:17 06:00:00
C 17345 op 30 3/5/22 16:20 08:00:00
B 12727 op 20 27/4/22 11:00 02:00:00
A 18001 op10 27/4/22 13:20 01:00:00
B 18001 op 20 29/4/22 13:00 04:00:00
C 18001 op 30 5/5/22 13:00 09:00:00

I understand it's easy enough to do the Order By OrderNo, OpNo to get the rows sorted into 'blocks' of each OrderNo with asc (or desc) OpNo. But the problem I'm then having is how do I order each of these 'blocks' by the StartTime of the lowest OpNo in each of these 'blocks'?

Hopefully I've made sense?

CodePudding user response:

Using first_value

select *
from (
    select *, first_value(StartTime) over(partition by OrderNo order by OpNo) blockStart    
    from mytable
) t
order by blockStart, OrderNo, OpNo
  • Related