单个组中差异顺序组的最小值最大值
min max out of diff sequential groups in single group
有什么方法可以从单个组中存在的不同顺序组中得到 min/max 吗?我想得到 min/max out of all sequential groups in a group
.
这里是输入数据
id dt
1 11-01-22
1 12-01-22
1 13-01-22
1 15-01-22
1 19-01-22
1 20-01-22
1 01-01-22
1 02-01-22
1 03-01-22
1 04-01-22
1 08-01-22
预期输出
Id, min , max
1, 01-01-22, 04-01-22
1, 08-01-22, 08-01-22
1, 11-01-22, 13-01-22
1, 15-01-22, 15-01-22
1, 19-01-22, 20-01-22
正在尝试使用此查询
select
id, dt,
case when dt - 1 = lag(dt) over (partition by id order by dt) then 0 else 1 end as mark
from consecutive
order by dt
使用这个有两个问题
无法处理组中第一次约会滞后导致的空值?如何处理标有--
.
的记录
1 01-01-22 1 --
1 02-01-22 0
1 03-01-22 0
1 04-01-22 0
1 08-01-22 1
1 11-01-22 1--
1 12-01-22 0
1 13-01-22 0
1 15-01-22 1
1 19-01-22 1--
1 20-01-22 0
如果我在 table 中有多个 ID,如何管理?
请分享建议。
我们可以尝试将每组按顺序排列的日期组成伪组。然后简单地聚合并获取每个组的最小和最大日期。
WITH cte AS (
SELECT t.*, CASE WHEN dt - LAG(dt) OVER (PARTITION BY id ORDER BY dt) > 1
THEN 1 ELSE 0 END AS val
FROM yourTable t
),
cte2 AS (
SELECT t.*, SUM(val) OVER (PARTITION BY id ORDER BY dt) AS grp
FROM cte t
)
SELECT id, MIN(dt) AS min_dt, MAX(dt) AS max_dt
FROM cte2
GROUP BY id, grp
ORDER BY id, MIN(dt);
Tim 的解决方案非常好,但这可以简化为 -
[SELECT id, MIN(dt), MAX(dt)
FROM (SELECT id, dt, dt - ROW_NUMBER() OVER(ORDER BY dt) rn
FROM your_table)
GROUP BY id, rn
ORDER BY id, rn][1]
有什么方法可以从单个组中存在的不同顺序组中得到 min/max 吗?我想得到 min/max out of all sequential groups in a group
.
这里是输入数据
id dt
1 11-01-22
1 12-01-22
1 13-01-22
1 15-01-22
1 19-01-22
1 20-01-22
1 01-01-22
1 02-01-22
1 03-01-22
1 04-01-22
1 08-01-22
预期输出
Id, min , max
1, 01-01-22, 04-01-22
1, 08-01-22, 08-01-22
1, 11-01-22, 13-01-22
1, 15-01-22, 15-01-22
1, 19-01-22, 20-01-22
正在尝试使用此查询
select
id, dt,
case when dt - 1 = lag(dt) over (partition by id order by dt) then 0 else 1 end as mark
from consecutive
order by dt
使用这个有两个问题
无法处理组中第一次约会滞后导致的空值?如何处理标有
的记录--
.1 01-01-22 1 -- 1 02-01-22 0 1 03-01-22 0 1 04-01-22 0 1 08-01-22 1 1 11-01-22 1-- 1 12-01-22 0 1 13-01-22 0 1 15-01-22 1 1 19-01-22 1-- 1 20-01-22 0
如果我在 table 中有多个 ID,如何管理?
请分享建议。
我们可以尝试将每组按顺序排列的日期组成伪组。然后简单地聚合并获取每个组的最小和最大日期。
WITH cte AS (
SELECT t.*, CASE WHEN dt - LAG(dt) OVER (PARTITION BY id ORDER BY dt) > 1
THEN 1 ELSE 0 END AS val
FROM yourTable t
),
cte2 AS (
SELECT t.*, SUM(val) OVER (PARTITION BY id ORDER BY dt) AS grp
FROM cte t
)
SELECT id, MIN(dt) AS min_dt, MAX(dt) AS max_dt
FROM cte2
GROUP BY id, grp
ORDER BY id, MIN(dt);
Tim 的解决方案非常好,但这可以简化为 -
[SELECT id, MIN(dt), MAX(dt)
FROM (SELECT id, dt, dt - ROW_NUMBER() OVER(ORDER BY dt) rn
FROM your_table)
GROUP BY id, rn
ORDER BY id, rn][1]