Sql server T-SQL行数条件/案例

Sql server T-SQL行数条件/案例,sql-server,tsql,Sql Server,Tsql,我有下面的数据样本,其中有一个行数函数,它以前为我们做过这项工作 +----+-------------------------+------+--------+------+-----+ | ID | Start_Date | Code | Serial | Type | Sqn | +----+-------------------------+------+--------+------+-----+ | 03 | 2020-09-23 00:00:00.000

我有下面的数据样本,其中有一个行数函数,它以前为我们做过这项工作

+----+-------------------------+------+--------+------+-----+
| ID |       Start_Date        | Code | Serial | Type | Sqn |
+----+-------------------------+------+--------+------+-----+
| 03 | 2020-09-23 00:00:00.000 |  674 |   4388 | P    |   1 |
| 03 | 2020-09-24 00:00:00.000 |  654 |   4388 | T    |   1 |
| 03 | 2020-09-24 00:00:00.000 |  912 |   4388 | T    |   2 |
| 42 | 2019-08-23 00:00:00.000 |  671 |   1316 | P    |   1 |
| 42 | 2019-08-23 00:00:00.000 |  921 |   1316 | P    |   2 |
| 42 | 2019-08-27 00:00:00.000 |  671 |   1316 | P    |   1 |
| 42 | 2019-08-29 00:00:00.000 |  671 |   1316 | P    |   1 |
| 42 | 2019-08-29 00:00:00.000 |  921 |   1316 | P    |   2 |
| 42 | 2019-08-29 00:00:00.000 |  654 |   1316 | T    |   3 |
| 42 | 2019-08-29 00:00:00.000 |  911 |   1316 | T    |   4 |
| 51 | 2020-09-22 00:00:00.000 |  674 |   3210 | P    |   1 |
| 51 | 2020-09-22 00:00:00.000 |  654 |   3210 | T    |   2 |
| 51 | 2020-09-22 00:00:00.000 |  912 |   3210 | T    |   3 |
+----+-------------------------+------+--------+------+-----+

ROW_NUMBER () OVER (PARTITION BY Serial,[Start_Date] ORDER BY Type, Sqn) AS Sqn
但是,由于流程更改,我们需要处理某些记录(前几天为674+p),以便在不影响其他记录的情况下一起进行分区

i、 e.如下所示

+----+-------------------------+------+--------+------+-----+
| ID |       Start_Date        | Code | Serial | Type | Sqn |
+----+-------------------------+------+--------+------+-----+
| 03 | 2020-09-23 00:00:00.000 |  674 |   4388 | P    |   1 |
| 03 | 2020-09-24 00:00:00.000 |  654 |   4388 | T    |   2 |
| 03 | 2020-09-24 00:00:00.000 |  912 |   4388 | T    |   3 |
| 42 | 2019-08-23 00:00:00.000 |  671 |   1316 | P    |   1 |
| 42 | 2019-08-23 00:00:00.000 |  921 |   1316 | P    |   2 |
| 42 | 2019-08-27 00:00:00.000 |  671 |   1316 | P    |   1 |
| 42 | 2019-08-29 00:00:00.000 |  671 |   1316 | P    |   1 |
| 42 | 2019-08-29 00:00:00.000 |  921 |   1316 | P    |   2 |
| 42 | 2019-08-29 00:00:00.000 |  654 |   1316 | T    |   3 |
| 42 | 2019-08-29 00:00:00.000 |  911 |   1316 | T    |   4 |
| 51 | 2020-09-22 00:00:00.000 |  674 |   3210 | P    |   1 |
| 51 | 2020-09-22 00:00:00.000 |  654 |   3210 | T    |   2 |
| 51 | 2020-09-22 00:00:00.000 |  912 |   3210 | T    |   3 |
+----+-------------------------+------+--------+------+-----+
您可以看到ID 03 Sqn现在是1,2,3,而不是1,1,2


我曾考虑在ROW_NUMBER函数中添加一个CASE,但无法完全破解它。

您可以稍微修改它,将一天添加到您设定的标准的开始日,而不是按StartDate进行分区,例如

DATEADD(DAY, CASE WHEN t.Type = 'P' AND Code = 674 THEN 1 ELSE 0 END, [Start_Date])
e、 g

ADENDUM

以下各项似乎按要求工作:

SELECT  t.ID, t.Code, t.Serial, t.Type, t.Start_Date,
        ROW_NUMBER () OVER (PARTITION BY Serial,PartitionDate ORDER BY Type, T.Code) 
FROM    (   SELECT  t.ID, 
                    PartitionDate = CASE WHEN t.Code = 674 AND t.Type = 'P' AND 
                                            DATEDIFF(DAY, LEAD(t.Start_Date) OVER(PARTITION BY ID ORDER BY Type, Code), t.Start_Date) <= 1 
                                        THEN LEAD(t.Start_Date) OVER(PARTITION BY ID ORDER BY t.Start_Date, Type, Code)
                                    ELSE t.Start_Date
                                END,
                    t.Code, 
                    t.Serial, 
                    t.Type,
                    t.Start_Date
            FROM @T AS t
        ) AS t
ORDER BY ID, t.Start_Date, t.Type
选择t.ID、t.code、t.Serial、t.Type、t.Start\u日期,
行号()超过(按序列划分,按类型划分日期顺序,T代码)
从(选择t.ID,
PartitionDate=当t.Code=674且t.Type='P'和

DATEDIFF(日期,前置(t.Start\u日期)超过(按ID划分,按类型、代码排序),t.Start\u日期)这对于我所讨论的例子是有效的,但不幸的是,它通过将22号更改为23号而抛出了ID 51。如果连续两天有两个这样性质的事件,会发生什么情况。例如,您希望以下小提琴的结果是什么:22号1,2,3和23号1,2,3
SELECT  t.ID, t.Code, t.Serial, t.Type, t.Start_Date,
        ROW_NUMBER () OVER (PARTITION BY Serial,PartitionDate ORDER BY Type, T.Code) 
FROM    (   SELECT  t.ID, 
                    PartitionDate = CASE WHEN t.Code = 674 AND t.Type = 'P' AND 
                                            DATEDIFF(DAY, LEAD(t.Start_Date) OVER(PARTITION BY ID ORDER BY Type, Code), t.Start_Date) <= 1 
                                        THEN LEAD(t.Start_Date) OVER(PARTITION BY ID ORDER BY t.Start_Date, Type, Code)
                                    ELSE t.Start_Date
                                END,
                    t.Code, 
                    t.Serial, 
                    t.Type,
                    t.Start_Date
            FROM @T AS t
        ) AS t
ORDER BY ID, t.Start_Date, t.Type