通过第二列分组排序

时间:2019-02-19 15:48:52

标签: sql sql-server

曾经试图解决这个问题,但没有成功。

这是我的桌子

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

感谢任何人的建议。谢谢!

2 个答案:

答案 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)