填写结果集中的每小时时间间隔

时间:2010-12-21 21:47:06

标签: sql-server tsql sql-server-2008

在某些时段,我使用时间戳将数据插入DB。我希望每小时查看一行没有记录填充最后记录数据的行:

表格

DateTime Value  
12     4  
15     6  

期望的结果

DateTime Value  
12       4  
13       4  
14       4  
15       6  
16       6  

应该是可能的,但我想不出任何有效的方法..

如何做到这一点?

2 个答案:

答案 0 :(得分:1)

这需要第二张桌子。每小时都会有一排 时间戳,无论该时间戳是否有行 你描述的表。

说你的表是:

CREATE TABLE [dbo].[TimeStamp]( [DateTimeHour] [int] NULL, [Value] [int] NULL )

新表是:

CREATE TABLE [dbo].[DateTimeTally]( [DateTimeHour] [int] NULL )

将行插入表TimeStamp,将行0-23插入表DateTimeTally。 所以,最终的查询是:

SELECT DateTimeHour,
        ISNULL((SELECT VALUE FROM TimeStamp ST1 WHERE ST1.DateTimeHour = 
            (SELECT MAX(DateTimeHour)FROM TimeStamp ST2 
                             WHERE ST2.DateTimeHour <= 
                              A.DateTimeHour)),0) Value --Not equal, actually less than or equal
 FROM
(SELECT D.DateTimeHour DateTimeHour,T.Value Value FROM TimeStamp T
        RIGHT OUTER JOIN DateTimeTally D
        ON(T.DateTimeHour = D.DateTimeHour))A

返回:

DateTimeHour      Value
----------- -----------
0           0
1           0
2           0
3           0
4           0
5           0
6           0
7           0
8           0
9           0
10          0
11          0
12          4
13          4
14          4
15          6
16          6
17          6
18          6
19          6
20          6
21          6
22          6
23          6

希望有所帮助:)

答案 1 :(得分:0)

确实误读了一次这个问题并提供了一个有效留下空白的答案;为了在sql中获取最后一个值,您需要循环效率较低的数据。

Create Table tblMyValues (MyHours int, MyValue int)
Insert into tblMyValues select 12, 4
Insert into tblMyValues select 15, 6
Insert into tblMyValues select 15, 6


Create Table tblResult (MyHour int, ReportValue Int)

Declare @i Int = 0, @LastValue Int
While @i <= 24
Begin

select @i = @i + 1
Select @LastValue = coalesce(MyValue, @LastValue)
From tblMyValues
Where MyHours = @i

    insert into tblResult 
    Select @i, @LastValue

End

select * from tblResult
drop table tblMyValues
drop table tblResult

返回

MyHour      ReportValue
----------- -----------
1           NULL
2           NULL
3           NULL
4           NULL
5           NULL
6           NULL
7           NULL
8           NULL
9           NULL
10          NULL
11          NULL
12          4
13          4
14          4
15          6
16          6
17          6
18          6
19          6
20          6
21          6
22          6
23          6
24          6