我有以下SQL语句:
DECLARE @time datetime;
SELECT @time = (select min(CreationDate) from TABLE);
DECLARE @time2 int;
SELECT @time2 = 15;
select ColumnA,
(case when CreationDate between @time and DATEADD(MINUTE,@time2***1**,@time)
then cast (@time2*1 as int)
when CreationDate between @time and DATEADD(MINUTE,@time2***2**,@time)
then cast (@time2*2 as int)
when CreationDate between @time and DATEADD(MINUTE,@time2***3**,@time)
then cast (@time2*3 as int)
when CreationDate between @time and DATEADD(MINUTE,@time2***4**,@time)
then cast (@time2*4 as int)
else 0
end) as 'interval', count(1)
from TABLE
group by
ColumnA,
(case when CreationDate between @time and DATEADD(MINUTE,@time2***1**,@time)
then cast (@time2*1 as int)
when CreationDate between @time and DATEADD(MINUTE,@time2***2**,@time)
then cast (@time2*2 as int)
when CreationDate between @time and DATEADD(MINUTE,@time2***3**,@time)
then cast (@time2*3 as int)
when CreationDate between @time and DATEADD(MINUTE,@time2***4**,@time)
then cast (@time2*4 as int)
else 0
end)
大家好,
感谢您的回复和评论。 我意识到也许我没有正确解释我的问题。让我再说一遍我的问题。
我有一个ETL进程,它运行并填充一个表,该表由名为" ColumnA"的列组成。其中显示了代码和创建时间列,名为" CreationDate"。 我想将结果除以创建时间。有时需要15分钟,有时需要20分钟或任何其他时间间隔。 所以我建立了一个名为" @ time"的变量。那说什么是间隔长度。 第一个问题:我不知道ETL过程会运行多长时间,因此我不知道在CASE语句中要生成多少行。 第二个问题:CASE语句行的数量还取决于我在变量" @ time"中选择的区间长度。也就是说,如果这个过程需要一个小时,那么" @ time"选定的时间间隔是15分钟然后我必须产生4个CASE语句行,但如果我选择" @ time"到10分钟然后我必须产生6个CASE声明行...... 我可以用参数做什么?
提前感谢您的时间和精力。 问候, 艾伦B.
答案 0 :(得分:0)
使用SQL时不要考虑循环。想想你想看到的结果。
如果我正确解释您的请求,您将选择具有给定@time和下一小时之间的创建日期的所有行。对于这些,您可以确定时间片。在你的情况下,它是15分钟,你想知道,创建日期是在前15分钟内(然后你输出15),或第二(然后你输出30),依此类推。带有另一个创建日期的记录,无论是在相关小时之前还是之后,都会得到输出0。
所以唯一的问题是要找到正确的公式,或多或少:得到时间差(以分钟为单位)除以分钟切片,得到的完整整数将告诉你它是哪个切片,从0开始一小时内的第一片。
应该或多或少:
select columna, interval_end_minute, count(*)
from
(
select
columna,
case when creationdate >= @time and creationdate < dateadd(hour,1,@time) then
(truncate((time_to_sec(datediff(creationdate, @time)) / 60) / @time2, 0) + 1) * @time2
else
0
end as interval_end_minute
from table
) data
group by columna, interval_end_minute;