我只想在flag ='n'时创建一个行号,或者我可以按标志对数据进行排序并对其进行排名。
例如:
+-----+-------+-------+
| ID | Flag1 | Flag2 |
+-----+-------+-------+
| 100 | N | N |
| 100 | N | N |
| 100 | Y | N |
| 100 | N | Y |
| 101 | N | N |
| 101 | N | Y |
+-----+-------+-------+
输出:
+---------+-----+-------+-------+
| Seq_num | ID | flag1 | flag2 |
+---------+-----+-------+-------+
| 1 | 100 | N | N |
| 2 | 100 | N | N |
| 3 | 100 | Y | N |
| 4 | 100 | N | Y |
| 1 | 101 | N | N |
| 2 | 101 | N | Y |
+---------+-----+-------+-------+
我已经使用row_number()和by进行分区编写了查询,但这不检查标志。 基本上,我首先需要按标志对数据进行排序。并且如果其中一个标志或两个标志均为Y,则将它们排在最后。 我该怎么办?
答案 0 :(得分:0)
您在row_number()
和partition by
的正确轨道上;以下查询应该有效:
declare @tmp table(ID int, Flag1 char(1), Flag2 char(1))
insert into @tmp values
(100, 'N','N')
,(100, 'N','N')
,(100, 'Y','N')
,(100, 'N','Y')
,(101, 'N','N')
,(101, 'N','Y')
select row_number() over(partition by ID order by id, flag2, flag1) as Seq_num,
ID,
flag1,
flag2
from @tmp
结果: