SQL Order By On两列但相同的prority

时间:2018-03-26 08:47:33

标签: sql sql-server

我坚持这个简单的选择并且不知道该怎么做。 我有这个:

   ID | Group
   ===========
    1 | NULL
    2 | 100
    3 | 100
    4 | 100
    5 | 200
    6 | 200
    7 | 100
    8 | NULL

并想要这个:

   ID | Group
   ===========
    1 | NULL
    2 | 100
    3 | 100
    4 | 100
    7 | 100
    5 | 200
    6 | 200
    8 | NULL

所有小组成员保持在一起,但其他小组按ID排序。 由于NULL记录,我无法编写此脚本。 NULL表示此记录没有任何组。

2 个答案:

答案 0 :(得分:3)

首先,您希望按照其组的最小ID来排序您的行 - 或者他们自己的ID,以防它们不属于任何组。然后您想按ID排序。那就是:

order by min(id) over (partition by case when grp is null then id else grp end), id

如果ID和组可以重叠(即,相同的数字可用于ID和组,例如将ID 9 /组1的记录添加到示例数据),则应将partition子句更改为< / p>

order by min(id) over (partition by case when grp is null 
                                    then 'ID' + cast(id as varchar)
                                    else 'GRP' + cast(grp as varchar) end),
         id;

Rextester演示:http://rextester.com/GPHBW5600

答案 1 :(得分:1)

null后的数据怎么样?在评论中你说不要对空值进行排序。

declare @T table (ID int primary key, grp int);
insert into @T values
       (1, NULL)
     , (3, 100)
     , (5, 200)
     , (6, 200)
     , (7, 100)
     , (8, NULL)
     , (9, 200)
     , (10, 100)
     , (11, NULL)
     , (12, 150);
select ttt.* 
  from (  select tt.* 
               , sum(ff) over (order by tt.ID) as sGrp
          from ( select t.*
                      , iif(grp is null or lag(grp) over (order by id) is null, 1, 0) as ff 
                   from @T t
               ) tt
       ) ttt
order by ttt.sGrp, ttt.grp, ttt.id

ID          grp         ff          sGrp
----------- ----------- ----------- -----------
1           NULL        1           1
3           100         1           2
7           100         0           2
5           200         0           2
6           200         0           2
8           NULL        1           3
10          100         0           4
9           200         1           4
11          NULL        1           5
12          150         1           6