如果它们不在“组”中的第一个项目的 30 秒内,我正在尝试计算项目的数量。我很难弄清楚这一点。
所以,我有这张桌子:
WITH ADates AS (
SELECT
Id
, SharedId
, TheDateTime
FROM (VALUES
(CAST(1 AS int), CAST(1 AS int), CAST('2019-01-01 01:01:00.00' AS datetime2(7))),
(2, 1, '2019-01-01 01:01:33.00'),
(3, 1, '2019-01-01 01:02:00.00'),
(4, 1, '2019-01-01 01:02:01.00'),
(5, 1, '2019-01-01 01:02:04.00'),
(6, 1, '2019-01-01 01:06:15.00'),
(7, 2, '2019-01-01 01:06:00.00'),
(8, 2, '2019-01-01 01:06:45.00'),
(9, 1, '2019-01-01 01:02:31.00'),
(10, 2, '2019-01-01 01:06:05.00'),
(11, 2, '2019-01-01 01:06:46.00'),
) X (Id, SharedId, TheDateTime)
)
所以,我正在寻找的预期结果是:
+==========+=======+
| SharedId | Count |
+==========+=======+
| 1 | 4 |
+----------+-------+
| 2 | 2 |
+----------+-------+
数字由以下因素决定:
- 从新组中的第一个开始计数。
- 不在前一组的 30 秒内,因此它是一个新组并计数。
- 不要计算,因为它在 2 的 30 秒内。
- 不要计算,因为它在 2 的 30 秒内。
- 从前一组的 30 秒内开始计数(第 2 项)。
- 从前一组的 30 秒内开始计数(第 2 项)。
- 计算 SharedId 的新组。
- 计数,因为不在先前的分组内。
我想我应该为此做一个Window Function
。只是不知道如何让它依赖于小组中的第一个。
它与第 6 项在另一组中的第 7 项之后有关。因此,它在我的查询中被视为一个新计数,结果为 5。这次 id=6 是否正确?可以在 id=7 之后吗?
查询变得如此复杂以至于我无法解释,或者已经太晚了(?),这不好,但是……。?
下一个似乎产生了正确的结果(有 9 条记录):
问题分类
我一直在寻找一种方法来使用跟踪内联操作的分析函数。单个运行分析函数只能执行这么多,但不能扩展到解决这个问题。嵌套分析函数的问题是我们丢失了关于动态模式的信息。
要允许动态内联模式匹配,您可以在Oracle中使用MATCH_RECOGNIZE。不过,我不知道如何在Sql Server中执行此操作。然后我遇到了一个类似的问题,使用递归 CTE解决了这个问题。
建议的解决方案
CteBase
并且CteRecursive
受到Bogdan Sahlean 对这个相关问题的回答的极大启发。关于什么: