заполнение часовых промежутков времени в наборе результатов - PullRequest
1 голос
/ 22 декабря 2010

В некоторые часы я вставляю данные в БД с отметкой времени.Я хочу иметь почасовой просмотр строк без записей, заполненных данными последней записи:

Таблица

DateTime Value  
12     4  
15     6  

Желаемый результат

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

Это должно быть возможно, но я не могу думать о каком-либо эффективном способе ..

Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Для этого требуется вторая таблица.В нем будет строка для каждых часовых отметок времени, независимо от того, есть ли строки для этих отметок времени для таблицы, которую вы описали.

Скажем, ваша таблица:

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

Надеюсь, что поможет:)

0 голосов
/ 22 декабря 2010

ОК, неправильно прочитав вопрос и предоставив ответ, который эффективно устраняет пробелы; чтобы получить последнее значение в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...