首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取日期周期

获取日期周期
EN

Stack Overflow用户
提问于 2022-06-16 05:40:26
回答 2查看 39关注 0票数 0

有必要得到日期周期。输入数据:

代码语言:javascript
复制
     login    date_start    date_end    code
    'user1', '2022-02-09', '2022-02-09'  DO
    'user1', '2022-02-10', '2022-02-10'  DO
    'user1', '2022-02-11', '2022-02-11'  DO
    'user1', '2022-03-28', '2022-03-28'  OT
    'user1', '2022-03-29', '2022-03-29'  OT
    'user1', '2022-03-30', '2022-03-30'  OT
    'user1', '2022-03-31', '2022-03-31'  OT
    'user1', '2022-04-01', '2022-04-01'  OT
    'user1', '2022-04-04', '2022-04-04'  DO

预期结果:

代码语言:javascript
复制
login  date_start  date_end   
user1  2022-02-09  2022-02-11 
user1  2022-03-28  2022-04-01
user1  2022-04-04  2022-04-04
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-16 05:54:52

这是一个缺口和岛屿问题。这里我们可以使用的一个技巧是创建一个伪组,跟踪每个记录所属的连续日期岛。

代码语言:javascript
复制
WITH cte AS (
    SELECT *, CASE WHEN LAG(date_start, 1, date_start) OVER
                        (PARTITION BY login ORDER BY date_start) =
                        DATEADD(day, -1, date_start)
                   THEN 0 ELSE 1 END AS cnt
    FROM yourTable
),
cte2 AS (
    SELECT *, SUM(cnt) OVER (PARTITION BY login ORDER BY date_start) AS grp
    FROM cte
)

SELECT login, MIN(date_start) AS date_start, MAX(date_end) AS date_end
FROM cte2
GROUP BY login, grp
ORDER BY MIN(date_start);

Demo

在上面的第一个CTE中,当上一个日期不是比当前日期早一天时,别名cnt被赋值为1。然后,我们可以对这一列进行求和,并获得形成连续范围的一组日期。

票数 0
EN

Stack Overflow用户

发布于 2022-06-16 05:43:07

像这样

select max(date_end) date_end , min(date_start) date_start, login from table group by login, code

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72640993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档