单个组中差异顺序组的最小值最大值

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. 无法处理组中第一次约会滞后导致的空值?如何处理标有--.

    的记录
     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
    
  2. 如果我在 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]

Demo.