我坚持这个简单的选择并且不知道该怎么做。 我有这个:
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表示此记录没有任何组。
答案 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