Sql 仅为标志N'创建序列;

Sql 仅为标志N'创建序列;,sql,sql-server,tsql,sql-server-2012,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

我只想在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,则最后对它们进行排序。
我怎样才能做到这一点呢?

您使用
行编号()和
分区的方法是正确的;以下查询应该可以工作:

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
结果: