gpt4 book ai didi

基于 while 循环的 SQL 查询

转载 作者:行者123 更新时间:2023-12-04 03:10:54 25 4
gpt4 key购买 nike

我正在尝试使用 while 循环构建一个 sql 查询,该循环每次迭代将日期时间递增一分钟,然后根据时间生成一个选择语句:

declare @dt datetime
set @dt = '2011-7-21'
while @dt < '2011-7-22'
begin
select Count(*) From Actions Where Timestamp = @dt
set @dt = DATEADD(mi, 1, @dt)
end

查询按预期工作,除了 while 循环的每次迭代似乎完全生成一个新查询,而不是简单地生成一个新行。有没有一种方法可以构造它,以便它的一个查询和每一行都是通过循环的增量生成的?我相信这是因为 select 语句在循环内,但我不确定如何以不同的方式构造它。

编辑 - 这是我使用临时表想出的方法,但速度很慢。也许有更快的方法?如果不是很好,至少这个有效:

create table #temp 
(
[DT] datetime not null,
[Total] int not null
)

declare @dt datetime
declare @result int
set @dt = '2011-7-21'
while @dt < '2011-7-22'
begin
set @result = Count(*) From Actions Where Timestamp = @dt
insert #temp ([DT],[Total]) values (@dt, @result)
set @dt = DATEADD(mi, 1, @dt)
end

select * from #temp;

drop table #temp;

最佳答案

一种方法是使用数字表

declare @dt datetime
set @dt = '2011-07-21'

select DATEADD(mi, number, @dt)
from master..spt_values
where type = 'P'
and DATEADD(mi, number, @dt) < '2011-07-22'

如果你有自己的数字表,就用那个

查看此处了解更多信息 http://wiki.lessthandot.com/index.php/Date_Ranges_Without_Loops

你完整的查询就像

DECLARE @dt DATETIME
SET @dt = '2011-07-21'

SELECT x.SomeTime,y.TheCount FROM
(SELECT DATEADD(mi, number, @dt) as SomeTime FROM master..spt_values
WHERE TYPE = 'P'
AND DATEADD(mi, number, @dt) < '2011-07-22') x
LEFT JOIN (
SELECT TIMESTAMP, COUNT(*) AS TheCount
FROM Actions
GROUP BY TIMESTAMP
) AS y
ON x.SomeTime = dateadd(mi, datediff(mi, 0, y.Timestamp)+0, 0)

关于基于 while 循环的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6794542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com