Как получить статус записи в определенный день. SQL - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь создать запрос, чтобы проверить, была ли запись (оповещение) открыта в течение определенного периода времени.

Первая таблица имеет только текущий статус записи.

    table: ALERT

    intID  |CurrentStateID| DateCreated
   -----------------------------------
    3      |Closed        | 10/11/2009

вторая таблица имеет историю статуса оповещения.

    tblState

    intContextID|strToStateName|datTimeStamp
   -----------------------------------
    3       |Unassigned    |10/11/2009
    3       |Closed        |10/14/2009

Вот мой желаемый вывод:

    DESIRED OUTPUT

    DATE        |DAY        |TOTAL_OPEN
    -----------------------------------
    10/10/2009  |Friday     |0
    10/11/2009  |Saturday   |1
    10/12/2009  |Sunday     |1
    10/13/2009  |Monday     |1
    10/14/2009  |Tuesday    |0
    10/15/2009  |Wednesday  |0

Мне удалось написать часть кода, но я думаю, что это соединение с таблицей AllDays, которое может быть неправильным.

DECLARE @StartDate DATETIME = '2009-10-10';
DECLARE @EndDate DATETIME = '2009-10-15 23:59:59';

WITH AllDays
AS (
    SELECT @StartDate AS [Date]
        , 1 AS [level]

    UNION ALL

    SELECT DATEADD(DAY, 1, [Date])
        , [level] + 1
    FROM AllDays
    WHERE [Date] < @EndDate
    )
SELECT CAST(AllDays.[Date] AS DATE) AS 'DATE'
    , datename(dw, AllDays.[Date]) AS 'DAY'
    ,ISNULL(TOTAL_OPEN, 0) as TOTAL_OPEN
FROM AllDays
LEFT JOIN (
    SELECT DISTINCT s.datTimeStamp AS 'DATE'
        , count(A.intID) AS 'TOTAL_OPEN'
    FROM Alert A
    INNER JOIN tblState S ON A.intID = S.intContextID
    WHERE strToStateName = 'Unassigned'
    GROUP BY datTimeStamp
    ) AS TOTAL_OPEN ON TOTAL_OPEN.DATE = AllDays.[Date]

Оповещение было открыто с 10-11 до 10-13, но, поскольку я присоединяюсь к отметке даты и времени, результаты показывают только 1 для 10/11.

Вот схема ссылка !

1 Ответ

0 голосов
/ 23 мая 2019

ОК. Один (по общему признанию, отвратительный) способ сделать это, чтобы создать udf, который вычисляет счетчик открытых дней для данного дня следующим образом:

CREATE FUNCTION [dbo].[fn_open_alert_count] (@date date)
RETURNS int
AS
BEGIN
RETURN (SELECT COUNT(intContextID) as opencount FROM tblState  WHERE strToStateName = 'Unassigned' AND datTimeStamp <= @date) - (SELECT COUNT(intContextID) as closedcount FROM tblState  WHERE strToStateName = 'Closed' AND datTimeStamp <= @date) 
END 

Тогда вы можете сделать запрос так:

DECLARE @StartDate DATETIME = '2009-10-10';
DECLARE @EndDate DATETIME = '2009-10-15 23:59:59';

WITH AllDays
AS (
    SELECT @StartDate AS [Date]
        , 1 AS [level]

    UNION ALL

    SELECT DATEADD(DAY, 1, [Date])
        , [level] + 1
    FROM AllDays
    WHERE [Date] < @EndDate
    )
SELECT CAST(AllDays.[Date] AS DATE) AS 'DATE'
    , datename(dw, AllDays.[Date]) AS 'DAY'
    ,[dbo].[fn_open_alert_count](AllDays.[Date])
FROM AllDays

Если у вас нет разрешения на создание функций, вы можете встроить функциональность следующим образом:

DECLARE @StartDate DATETIME = '2009-10-10';
DECLARE @EndDate DATETIME = '2009-10-15 23:59:59';

WITH AllDays
AS (
    SELECT @StartDate AS [Date]
        , 1 AS [level]

    UNION ALL

    SELECT DATEADD(DAY, 1, [Date])
        , [level] + 1
    FROM AllDays
    WHERE [Date] < @EndDate
    )
SELECT CAST(AllDays.[Date] AS DATE) AS 'DATE'
    , datename(dw, AllDays.[Date]) AS 'DAY'
    ,(SELECT COUNT(intContextID) as opencount FROM tblState  WHERE strToStateName = 'Unassigned' AND datTimeStamp <= AllDays.[Date]) - (SELECT COUNT(intContextID) as closedcount FROM tblState  WHERE strToStateName = 'Closed' AND datTimeStamp <= AllDays.[Date]) AS TOTAL_OPEN
FROM AllDays

Это дает мне следующий вывод:

DATE        DAY         TOTAL_OPEN
2009-10-10  Saturday    0
2009-10-11  Sunday      1
2009-10-12  Monday      1
2009-10-13  Tuesday     1
2009-10-14  Wednesday   0
2009-10-15  Thursday    0
2009-10-16  Friday      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...