曾经试图解决这个问题,但没有成功。
这是我的桌子
SN PID
---- ---------
1 NULL
2 1000005
3 NULL
4 1000002
5 1000005
6 NULL
7 1000002
8 NULL
9 1000005
我需要按SN排序,但是当PID不为null时,它需要将它们分组在一起。因此,我要寻找的结果是
SN PID
---- ---------
1 NULL
2 1000005
5 1000005 -- group together with the previous SAME PID
9 1000005 -- continue to group together
3 NULL -- continue to the next unused SN (no more PID = 1000005)
4 1000002
7 1000002 -- group together with the previous SAME PID
6 NULL -- continue to the next unused SN
8 NULL
感谢任何人的建议。谢谢!
答案 0 :(得分:3)
我将通过使用人工列进行排序来解决此问题,该人工列等于具有相同SN
的所有行的MIN PID
,或者等于{{1 }}为空。
SN
如果需要在输出中排除PID
,则可以将以上内容用作CTE,也可以将CASE表达式直接插入ORDER BY中,并将其排除在SELECT列表之外。
答案 1 :(得分:1)
我将使用窗口功能:
select sn, pid
from (select t.*,
dense_rank() over (order by pid desc) as seqnum_pid,
row_number() over (partition by pid order by sn) as seqnum_null
from t
) t
order by (case when pid is null then seqnum_null else seqnum_pid end),
(case when pid is null then 1 else 2 end);
Here是db <>小提琴。
或者,您可以在order by
中使用窗口函数:
select sn, pid
from t
order by (case when pid is null then sn else min(sn) over (partition by pid) end)