Как получить результаты из значений предыдущих строк в TSQL или Power Query - PullRequest
0 голосов
/ 14 октября 2018

У меня есть таблица, в таблице у меня есть, например, 4 столбца

(идентификатор (например, 12 различных идентификаторов, повторяющихся для 10000 строк, но затем добавляется +26 для следующих 10000 строк), дата (упорядоченаэтим нельзя изменить-), Ошибка (-1,0,1), ItemName,

Что мне делать, если я хочу, чтобы мой запрос предупредил меня, если было 3 ошибки для того жеИдентификатор сразу после друг друга (Не уверен, что строки на самом деле располагаются сразу после друг друга, потому что вся таблица упорядочена по дате, поэтому идентификатор 1 может быть в первой строке, а затем, например, в 13-м, а затем в 25-м)?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Это должно помочь вам начать;используйте функцию LAG () в SQL Server 2012+, чтобы определить значение в предыдущей строке и в строке перед этим (может быть способ сделать это за один проход, а не за два, как я делаю).Это вернет последнюю строку в последовательности из трех ошибок (при условии, что -1 - код ошибки).

USE tempdb;

CREATE TABLE Logs (ID int, Dt datetime, error int, itemname varchar(20))
CREATE CLUSTERED INDEX cx ON LOGS (dt)


INSERT INTO LOGS
VALUES (1, '20180101', -1, 'error'),
(1, '20180102', -1, 'error'),
(1, '20180103', -1, 'error'),
(1, '20180104', 0, 'no error'),
(2, '20180102', -1, 'error'),
(2, '20180103', -1, 'error'),
(2, '20180104', 0, 'no error'),
(2, '20180105', -1, 'error')


; with c AS (
SELECT *
    , LAG(error, 1,0) OVER (PARTITION BY ID ORDER BY Dt) prv1
    , LAG(error, 2,0) OVER (PARTITION BY ID ORDER BY Dt) prv2
FROM Logs
)
SELECT *
FROM c
WHERE error = prv1 and error = prv2
    AND error = -1


DROP TABLE Logs
0 голосов
/ 14 октября 2018

Согласно тому, что я понимаю, вам нужны Предметы, в которых есть 3 ошибки, и они расположены в последовательных строках по порядку по дате.Пожалуйста, обратитесь мой код и эта поддержка SQL Server

/*create table*/
CREATE TABLE YourTable( PK_Id   int NOT NULL IDENTITY(1,1) primary key,
                        ID      int NOT NULL,
                        CreatedDate datetime NOT NULL,
                        Error   int NOT NULL,
                        ItemName    nvarchar(100) NULL);
/*sample data 1*/
INSERT INTO YourTable VALUES (1, '2018-10-13 10:10:10', -1, 'Item-1'),
                             (2, '2018-10-13 10:10:15', -1, 'Item-2'),
                             (3, '2018-10-13 10:10:17', -1, 'Item-3'),
                             (4, '2018-10-13 10:10:17', -1, 'Item-4'),
                             (1, '2018-10-14 10:10:10', 0, 'Item-1'),
                             (2, '2018-10-14 10:10:15', 0, 'Item-2'),
                             (3, '2018-10-14 10:10:17', 0, 'Item-3'),
                             (4, '2018-10-14 10:10:17', 0, 'Item-4'),
                             (1, '2018-10-15 10:10:10', 1, 'Item-1'),
                             (2, '2018-10-15 10:10:15', 1, 'Item-2'),
                             (3, '2018-10-15 10:10:17', 1, 'Item-3'),
                             (4, '2018-10-15 10:10:17', 1, 'Item-4')
/*sample data 2*/
INSERT INTO YourTable VALUES (5, '2018-10-16 10:10:10', -1, 'Item-5'),
                             (5, '2018-10-16 10:10:15', 0, 'Item-5'),
                             (5, '2018-10-16 10:10:17', 1, 'Item-5')


SELECT Id, ItemName
  FROM YourTable
 GROUP BY Id, ItemName
HAVING COUNT(Error) = 3                 /*check number of errors*/
   AND SUM(Error) = 0                   /*check all 3 errors*/
   AND SUM(PK_Id) = MIN(PK_Id) * 3 + 3  /*check right after each error*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...