仅为标记N'创建序列

时间:2018-08-01 17:00:21

标签: sql sql-server tsql sql-server-2012

我只想在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,则将它们排在最后。 我该怎么办?

1 个答案:

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

结果:

enter image description here