首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL中的连贯间隔?

SQL中的连贯间隔?
EN

Stack Overflow用户
提问于 2021-04-22 09:11:38
回答 2查看 89关注 0票数 0

考虑一下简单的日记表:

代码语言:javascript
复制
 Date   Mood
 ----   ----
 1      Good
 2      Good
 3      Good
 4      Bad
 5      Bad
 6      Good

我对的心情间隔感兴趣,这样我就可以得到如下的结果:

代码语言:javascript
复制
 Mood   BeginDate   EndDate
 ----   ---------   -------
 Good   1           3
 Bad    4           5 
 Good   6           6

在不使用迭代的SQL中,这是可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-22 10:54:13

如果从每一种情绪开始的天数中减去一个序列号,则当这些值相邻时,您将得到一个常数:

代码语言:javascript
复制
 Date   Mood    Seqnum
 1      Good       1
 2      Good       2
 3      Good       3
 4      Bad        1
 5      Bad        2
 6      Good       4

然后,您可以使用聚合来做您想做的事情。如果date确实是一个数字:

代码语言:javascript
复制
select mood, min(date), max(date)
from (select t.*,
             row_number() over (partition by mood order by date) as seqnum
      from t
     ) t
group by mood, (date - seqnum);

如果date真的是date

代码语言:javascript
复制
select mood, min(date), max(date)
from (select t.*,
             row_number() over (partition by mood order by date) as seqnum
      from t
     ) t
group by mood, dateadd(day, - seqnum, date)
票数 2
EN

Stack Overflow用户

发布于 2021-04-22 15:36:45

针对戈登·林诺夫的回答中的这一评论:

如果date真的是一个数字:

如果不是呢?你还有一条前进的路,只要稍微调整一下。

代码语言:javascript
复制
WITH d AS (
    SELECT * FROM (VALUES
        (cast('2021-04-22 00:00' as datetime2(0)), 'Good'),
        (cast('2021-04-22 00:05' as datetime2(0)), 'Good'),
        (cast('2021-04-22 00:07' as datetime2(0)), 'Good'),
        (cast('2021-04-22 00:10' as datetime2(0)), 'Bad'),
        (cast('2021-04-22 00:25' as datetime2(0)), 'Bad'),
        (cast('2021-04-22 01:43' as datetime2(0)), 'Good')
    ) AS x([date], mood)        
), t AS (
    SELECT *, 
        ROW_NUMBER() OVER (ORDER BY [date]) AS a,
        ROW_NUMBER() OVER (PARTITION BY mood ORDER BY [date]) AS seqnum
    FROM d
)
select mood, min(date), max(date)
from t
group by mood, a - seqnum
order by min(date)

将其分解后,第一个cte只是您的数据,但现在是一个datetime列,而不是date的整数。注意,连续行之间的间隔不是固定的(可以是,但我这样做是为了表明它不一定是必要的)。在这里,我们使用row_number()函数计算两个值-一个枚举整个集合,另一个按mood进行分区。其余的(在精神上)和戈登的回答是一样的。

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

https://stackoverflow.com/questions/67210259

复制
相关文章

相似问题

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