考虑一下简单的日记表:
Date Mood
---- ----
1 Good
2 Good
3 Good
4 Bad
5 Bad
6 Good我对的心情间隔感兴趣,这样我就可以得到如下的结果:
Mood BeginDate EndDate
---- --------- -------
Good 1 3
Bad 4 5
Good 6 6在不使用迭代的SQL中,这是可能的吗?
发布于 2021-04-22 10:54:13
如果从每一种情绪开始的天数中减去一个序列号,则当这些值相邻时,您将得到一个常数:
Date Mood Seqnum
1 Good 1
2 Good 2
3 Good 3
4 Bad 1
5 Bad 2
6 Good 4然后,您可以使用聚合来做您想做的事情。如果date确实是一个数字:
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
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)发布于 2021-04-22 15:36:45
针对戈登·林诺夫的回答中的这一评论:
如果
date真的是一个数字:
如果不是呢?你还有一条前进的路,只要稍微调整一下。
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进行分区。其余的(在精神上)和戈登的回答是一样的。
https://stackoverflow.com/questions/67210259
复制相似问题