sql - 找到不同行中日期时间间隔的重叠?
问题描述
我有一张表,它是一些任务的日志。不同的任务有不同的TaskConfigId。任务的每次运行都有不同的 TaskGuid。所以相同的任务但不同的运行会有不同的TaskGuid。每次运行将以状态 10 开始,以状态 20 结束。它可能具有介于 10 到 20 之间的其他状态。
不同的任务正在按计划运行。有些运行非常频繁,有些则不运行。因此,它可以同时运行多个任务,但每个任务一次只能运行一个实例。现在,由于一些未知的原因,有时,一项任务可能有多个实例在运行。我们想查询数据库以查看是否发生了这种情况。
这是日志的屏幕截图,这是正常的。发生问题时,对于 TaskGuid 不同的 TaskConfigId#100,它可能在 3468118 和 3468117 之间有一行。我们想找到这样的案例。
我认为我们需要通过TaskConfigId和TaskGuid进行分组,然后找到状态20和10(比如A和B)的TaskTrackingId,然后检查相同的TaskConfigId,A和B之间是否有TaskTrackingId。
SELECT TaskConfigId, TaskGuid
, MAX(CreatedDate) AS [Max]
, MIN(CreatedDate) AS [Min]
FROM [AptFeed].[TaskTracking]
GROUP BY TaskConfigId, TaskGuid
HAVING MAX(TaskStatusId) = 20 AND MIN(TaskStatusId) = 10
ORDER BY [Max] DESC
这样,我可以找到任务运行的开始和结束日期时间,但是我们如何使用它来查找不同的任务运行是否有重叠呢?
在 C# 中很容易做到这一点,但我们可以在 SQL Server 中做到这一点吗?
- 澄清一个问题:请参阅下面的屏幕截图。对于#270,任务运行“7b433....”有 10 和 20。但是,在它们之间,#270 有 3 个条目。其中“db055....”开始较早,所以我们在屏幕截图上看不到 10。这就是我们要查明的情况。如果中间没有#270的入口,就ok了。并且可以有其他任务的条目,即 260、280、100....
解决方案
了解您的环境中可能需要考虑更多因素后,您可以尝试这样的事情(可在 SSMS 中运行):
/* TASKTRACKING MOCK-UP */
DECLARE @TaskTracking TABLE (
TaskTrackingId INT,
TaskConfigId INT,
TaskGuid VARCHAR(50),
TaskStatusId INT,
CreatedDate DATETIME
);
/* TASKTRACKING DATA */
INSERT INTO @TaskTracking ( TaskTrackingId, TaskConfigId, TaskGuid, TaskStatusId, CreatedDate )
VALUES
( 3426760, 270, 'e881670a-e643-4b25-a4f4-dd30fc28bd23', 10, '2020-08-26 19:00:00.053' ),
( 3424077, 270, '9ff 91e67-071b-48f2-bOdb-172d3e9f 234a', 20, '2020-08-26 17:19:30.740' ),
( 3422102, 270, '9ff 91e67-071b-4812-bOdb-172d3e9f 234a', 10, '2020-08-26 16:52:36.443' ),
( 3422101, 270, '6ef629ae-8ee1-44b7-aedd-43b246379e8f', 20, '2020-08-26 16:52:36.430' ),
( 3411426, 270, '6ef629ae-8ee1-44b7-aedd-43b246379e8f', 10, '2020-08-26 14:26:01.613' ),
( 3411425, 270, 'ce4f8688-5191-4735-a7e9-525781f3d72f', 20, '2020-08-26 14:26:01.600' ),
( 3400704, 270, 'ce4f8688-5191-4735-a7e9-525781f3d72f', 10, '2020-08-26 12:00:00.190' ),
( 3397311, 270, '7dbcc241-3c86-426f-9f6b-ef 12dfd5b2a1', 20, '2020-08-26 11:12:37.650' ),
( 3397310, 270, '7dbcc241-3c86-426f-9f6b-ef 12dfd5b2a1', 10, '2020-08-26 11:12:37.620' ),
( 3397309, 270, 'e46782caf 763-4580-89f 9-99da0d6a1762', 20, '2020-08-26 11:12:37.610' ),
( 3397077, 270, 'e46782caf763-4580-89f9-99da0d6a1762', 10, '2020-08-26 11:09:47.410' ),
( 3397076, 270, '7b433f62-6089-44ba-ad6c-eb767bd7e056', 20, '2020-08-26 11:09:47.400' ),
( 3397075, 270, '1890732e-cec3-476-9f44-69d37105ee40', 20, '2020-08-26 11:09:47.400' ),
( 3395100, 270, '1890732e-cec3-476-9f44-69d37105ee40', 10, '2020-08-26 10:42:42.740' ),
( 3395099, 270, 'db05513a-20d5-4e40-96cc-c310ff1a0d4b', 20, '2020-08-26 10:42:42.730' ),
( 3394726, 270, '7b433f62-6089-44ba-ad6c-eb767bd7e056', 10, '2020-08-26 10:37:46.750' );
/* Return a list of tasks that have overlapping TaskConfigId values */
SELECT
*
FROM (
SELECT
TaskConfigId,
TaskGuid,
MIN ( CreatedDate ) AS MinDate,
MAX ( CreatedDate ) AS MaxDate
FROM @TaskTracking AS task
GROUP BY
TaskConfigId, TaskGuid
) AS Tasks
OUTER APPLY (
SELECT
COUNT ( DISTINCT TaskGuid ) AS OverlapTasks,
STRING_AGG ( TaskGuid, '|' ) AS OverlapGuids
FROM @TaskTracking AS x
WHERE
x.TaskConfigId = Tasks.TaskConfigId
AND x.CreatedDate > Tasks.MinDate AND x.CreatedDate <= Tasks.MaxDate
AND x.TaskGuid <> Tasks.TaskGuid
) AS Overlaps
WHERE
Overlaps.OverlapTasks > 0
ORDER BY
MinDate;
退货
+--------------+--------------------------------------+-------------------------+-------------------------+--------------+--------------------------------------------------------------------------------------------------------------+
| TaskConfigId | TaskGuid | MinDate | MaxDate | OverlapTasks | OverlapGuids |
+--------------+--------------------------------------+-------------------------+-------------------------+--------------+--------------------------------------------------------------------------------------------------------------+
| 270 | 7b433f62-6089-44ba-ad6c-eb767bd7e056 | 2020-08-26 10:37:46.750 | 2020-08-26 11:09:47.400 | 2 | 1890732e-cec3-476-9f44-69d37105ee40|1890732e-cec3-476-9f44-69d37105ee40|db05513a-20d5-4e40-96cc-c310ff1a0d4b |
| 270 | 1890732e-cec3-476-9f44-69d37105ee40 | 2020-08-26 10:42:42.740 | 2020-08-26 11:09:47.400 | 1 | 7b433f62-6089-44ba-ad6c-eb767bd7e056 |
+--------------+--------------------------------------+-------------------------+-------------------------+--------------+--------------------------------------------------------------------------------------------------------------+
推荐阅读
- java - 存在 WebMvcConfigurationSupport 时不会生成 Swagger UI
- scala - 使用 monad 转换器改变表达式结果
- java - 在运行 statWeblogic.sh 我遇到了 dcevm 的问题
- html - 使用 Thymeleaf 设置表格中的列宽
- javascript - 在 javascript 中不断出现此错误,错误:列引用“id”不明确
- css - 无法在tailwindcss框架中保持div的宽度
- python - 我如何总结 odoov11 中的 char 字段?
- google-apps-script - CheckBox Installable OnEdit 触发器仅在用户在活动单元格上按 Enter 时触发 - Apps 脚本
- javascript - 使用 borsh js 反序列化数组
- sql - 根据单个列中的多个条件选择多个列