首页 > 解决方案 > 仅为标志 N ' 创建序列

问题描述

我只想在 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() 和 partition by 编写了一个查询,但这不会检查标志。基本上,我需要先按标志对数据进行排序。如果其中一个标志或两者都是 Y,则最后对它们进行排序。我怎样才能做到这一点 ?

标签: sqlsql-servertsqlsql-server-2012

解决方案


你在正确的轨道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

结果:

在此处输入图像描述


推荐阅读