SQL顺序在两列上订购,但相同的贵宾



我陷入了这个简单的选择上,不知道该怎么做。我有这个:

   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订购。由于该零记录,我无法编写此脚本。零表示此记录没有任何组。

首先,您要按照他们组的最小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的记录添加到您的示例数据中(,则应将分区条款更改为<<<</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

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

最新更新