Несколько строк, выбранных из строки ранжированной даты - PullRequest
0 голосов
/ 16 сентября 2009

Пример таблицы:

TableName: ПРОСТОИ

Колонки:
EventID - int,
ReasonID - int,
StartTime - DateTime,
EndTime - DateTime

Я хотел бы рассчитать ежедневное время простоя каждого события за последние 30 дней. Однако событие может быть недоступно в течение нескольких дней, поэтому время начала может начаться за 31 день до и закончиться на следующей неделе. Поэтому мне нужно вернуть строку данных для этого события 30 раз. Событие также может длиться 10 минут, поэтому мне нужен ряд данных, показывающих это.

Пока я получаю только одну строку, представляющую все событие, которое происходит за 30 дней, вместо 30 строк.

База данных MS SQL Server 2005

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 16 сентября 2009

Возможно, вы захотите создать таблицу измерения даты - таблицу, которая представляет собой набор дней. Абсолютно простейший пример для ваших целей будет иметь один столбец, дату, и вы будете иметь одну строку для каждого дня подряд. Затем вы можете присоединить эту таблицу к вашей таблице простоя:

from dim_date t join downtime d on t.date between convert(varchar(10), d.start_date, 120) and convert(varchar(10), d.end_date, 120) 

Таким образом, если у вас есть время простоя, вы получите строку за каждый день, содержащую время простоя.

0 голосов
/ 16 сентября 2009

перед тем, как вы попробуете мой код, вам нужно выполнить однократную настройку таблицы чисел. это создаст таблицу имён Numbers со столбцом Number, имеющим строки со значениями от 1 до 10000:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number
    INTO Numbers
    FROM sys.objects s1
    CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)

Эта таблица номеров присоединена к существующей таблице, чтобы "создать" нужные вам строки, попробуйте следующее:

DECLARE @DownTime table (
EventID  int,
ReasonID  int,
StartTime  DateTime,
EndTime  DateTime)

INSERT INTO @DownTime VALUES (1,1,'9/10/2009 9:00am','9/10/2009 10:00am')
INSERT INTO @DownTime VALUES (2,1,'9/10/2009 1:00am','9/15/2009  1:00am')
INSERT INTO @DownTime VALUES (3,1,'9/10/2009'       ,'9/11/2009')

SELECT
    d.EventID,d.ReasonID,d.StartTime,d.EndTime
        , DATEADD(day,Number-1,d.StartTime) AS SequenceDate
    FROM @DownTime          d
        INNER JOIN Numbers  n ON n.Number<=DATEDIFF(day,d.StartTime,d.EndTime)+1

ВЫВОД:

EventID ReasonID StartTime               EndTime                 SequenceDate
------- -------- ----------------------- ----------------------- -----------------------
1       1        2009-09-10 09:00:00.000 2009-09-10 10:00:00.000 2009-09-10 09:00:00.000
2       1        2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-10 01:00:00.000
2       1        2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-11 01:00:00.000
2       1        2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-12 01:00:00.000
2       1        2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-13 01:00:00.000
2       1        2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-14 01:00:00.000
2       1        2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-15 01:00:00.000
3       1        2009-09-10 00:00:00.000 2009-09-11 00:00:00.000 2009-09-10 00:00:00.000
3       1        2009-09-10 00:00:00.000 2009-09-11 00:00:00.000 2009-09-11 00:00:00.000

(9 row(s) affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...