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