SQL 按顺序排列行块
SQL Arrange blocks of rows in Order 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
如何按 OrderNo,然后按 OpNo,然后按每个 OrderNo 中最低 OpNo 的 StartTime 对行进行排序?所以它看起来像这样:
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
我知道按 OrderNo、OpNo 进行排序很容易,可以将行排序到每个 OrderNo 的 'blocks' 中,并带有 asc(或 desc)OpNo。但是我遇到的问题是如何通过每个 'blocks'?
中最低 OpNo 的 StartTime 对每个 'blocks' 进行排序
希望我说得有道理?
使用first_value
select *
from (
select *, first_value(StartTime) over(partition by OrderNo order by OpNo) blockStart
from mytable
) t
order by blockStart, OrderNo, OpNo
假设我有一个看起来像这样的原始输出(完全按 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 |
如何按 OrderNo,然后按 OpNo,然后按每个 OrderNo 中最低 OpNo 的 StartTime 对行进行排序?所以它看起来像这样:
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 |
我知道按 OrderNo、OpNo 进行排序很容易,可以将行排序到每个 OrderNo 的 'blocks' 中,并带有 asc(或 desc)OpNo。但是我遇到的问题是如何通过每个 'blocks'?
中最低 OpNo 的 StartTime 对每个 'blocks' 进行排序希望我说得有道理?
使用first_value
select *
from (
select *, first_value(StartTime) over(partition by OrderNo order by OpNo) blockStart
from mytable
) t
order by blockStart, OrderNo, OpNo