как написать эту логику в SQL - PullRequest
1 голос
/ 26 марта 2019

Существует таблица с 3 столбцами, и каждые 2 минуты создается новая запись.

ID: ID создается для каждой записи в заказе (в хронологическом порядке вместе с датой и временемштамп)

Время: штамп даты и времени (который точно выполняется каждые 2 минуты)

Флаг: 0 или 1 (1 означает хороший 0 означает плохой)

Iхотите написать условие, чтобы проверить, установлен ли флаг 0 или 1 за последние 8 минут, до 4 минут и через 4 минуты, через 8 минут

Исходная таблица:

MONITORID   CREATEDATETIME    Flag
209263      26/3/2019 16:56     1
209262      26/3/2019 16:54     1
209261      26/3/2019 16:52     1
209260      26/3/2019 16:50     1
209259      26/3/2019 16:48     1
209258      26/3/2019 16:46     1
209257      26/3/2019 16:44     1
209256      26/3/2019 16:42     1
209255      26/3/2019 16:40     1
209254      26/3/2019 16:38     1
209253      26/3/2019 16:36     1
209252      26/3/2019 16:34     1
209251      26/3/2019 16:32     1
209250      26/3/2019 16:30     1
209249      26/3/2019 16:28     1
209248      26/3/2019 16:26     1
209247      26/3/2019 16:24     1
209246      26/3/2019 16:22     1
209245      26/3/2019 16:20     1
209244      26/3/2019 16:18     1

Окончательныйрезультат должен выглядеть следующим образом:

MONITORID   CREATEDATETIME    Flag  Flag_+4_-4  Flag_+0_-8
209263      26/3/2019 16:56     1       3           5
209262      26/3/2019 16:54     1       4           5
209261      26/3/2019 16:52     1       5           5
209260      26/3/2019 16:50     1       5           5
209259      26/3/2019 16:48     1       5           5
209258      26/3/2019 16:46     1       5           5
209257      26/3/2019 16:44     1       5           5
209256      26/3/2019 16:42     1       5           5
209255      26/3/2019 16:40     1       5           5
209254      26/3/2019 16:38     1       5           5
209253      26/3/2019 16:36     1       5           5
209252      26/3/2019 16:34     1       5           5
209251      26/3/2019 16:32     1       5           5
209250      26/3/2019 16:30     1       5           5
209249      26/3/2019 16:28     1       5           5
209248      26/3/2019 16:26     1       5           5
209247      26/3/2019 16:24     1       5           4
209246      26/3/2019 16:22     1       5           3
209245      26/3/2019 16:20     1       4           2
209244      26/3/2019 16:18     1       3           1

Причина, по которой мы должны придумать эту логику, состоит в том, чтобы за последние 8 минут посмотреть, все ли это хорошо.Затем суммируйте его до дневного уровня, чтобы показать, был ли он хорошим весь день.

Любая помощь очень ценится!

1 Ответ

3 голосов
/ 26 марта 2019

Это то, что вы после.При этом используется условный агрегат, а предложение ROWS BETWEEN для подсчета количества раз, когда Flag имеет значение 1 в определенном «диапазоне».Это, однако, требует , чтобы строки были с 2-минутными интервалами.если нет, то не будет работать так, как вы ожидаете:

WITH VTE AS(
    SELECT V.MONITORID,
           CONVERT(smalldatetime,V.CREATEDATETIME,103) AS CREATEDATETIME,
           Flag
    FROM (VALUES (209263,'26/3/2019 16:56',1),
                 (209262,'26/3/2019 16:54',1),
                 (209261,'26/3/2019 16:52',1),
                 (209260,'26/3/2019 16:50',1),
                 (209259,'26/3/2019 16:48',1),
                 (209258,'26/3/2019 16:46',1),
                 (209257,'26/3/2019 16:44',1),
                 (209256,'26/3/2019 16:42',1),
                 (209255,'26/3/2019 16:40',1),
                 (209254,'26/3/2019 16:38',1),
                 (209253,'26/3/2019 16:36',1),
                 (209252,'26/3/2019 16:34',1),
                 (209251,'26/3/2019 16:32',1),
                 (209250,'26/3/2019 16:30',1),
                 (209249,'26/3/2019 16:28',1),
                 (209248,'26/3/2019 16:26',1),
                 (209247,'26/3/2019 16:24',1),
                 (209246,'26/3/2019 16:22',1),
                 (209245,'26/3/2019 16:20',1),
                 (209244,'26/3/2019 16:18',1)) V(MONITORID, CREATEDATETIME, Flag))
SELECT V.MONITORID,
       V.CREATEDATETIME,
       V.Flag,
       COUNT(CASE V.Flag WHEN 1 THEN 1 END) OVER (ORDER BY V.CREATEDATETIME
                                                  ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS [Flag-4+4],
       COUNT(CASE V.Flag WHEN 1 THEN 1 END) OVER (ORDER BY V.CREATEDATETIME
                                                  ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS [Flag-8+0]
FROM VTE V
ORDER BY V.CREATEDATETIME DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...