Как 2 строки для расчета найти специальные 2 слова? - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть таблица ниже:

Date                              Msg

2019-04-11 10:14:02.773           AB123  <this is Succec bec next line is CD   
2019-04-11 10:14:02.647           CD123      
2019-04-11 10:11:03.670           AB123      
2019-04-11 10:11:03.500           CD123     
2019-04-10 09:53:39.743           AB123 <this is fail bec next line is not CD
2019-04-10 09:52:39.743           AB123
2019-04-10 09:53:39.743           CD123
2019-04-10 09:52:39.743           AB123 <this is fail bec next line is not CD
2019-04-10 09:52:39.743           AB123 <this is fail bec next line is NULL

Я хочу найти Msg top 2 строки AB, и CD успешно. ORDER BY Date

Если у Msg есть AB, продолжение появления не будет работать до тех пор, покаНабор CD 1

CREATE TABLE table1 (
  `Id` INTEGER,
  `Date` DATETIME,
  `Msg` VARCHAR(5)
);

INSERT INTO table1
  (`Id`, `Date`, `Msg`)
VALUES
  ('1', '2019-04-11 10:14:02.773', 'AB123'),
  ('2', '2019-04-11 10:14:02.647', 'CD123'),
  ('3', '2019-04-11 10:11:03.670', 'AB123'),
  ('4', '2019-04-11 10:11:03.500', 'CD123'),
  ('5', '2019-04-10 09:53:39.743', 'AB123'),
  ('6', '2019-04-09 09:53:39.587', 'AB123'),
  ('7', '2019-04-09 09:53:39.001', 'CD123'),
  ('8', '2019-04-08 07:53:39.587', 'AB123'), 
  ('9', '2019-04-07 08:53:39.111', 'AB123');

SELECT t.Id, t.Date, t.Msg 
FROM ( SELECT Id, Date, Msg, LEAD(Msg) OVER (ORDER BY Date DESC) AS NextMsg FROM table1 ) t 
WHERE t.Msg LIKE '%AB%' AND t.NextMsg LIKE '%AB%'  
ORDER BY t.Date DESC

Мой ожидаемый результат -

Id  Date                Msg    Check
5   2019-04-10 09:53:40 AB123  fail
8   2019-04-08 07:53:40 AB123  fail
9  2019-04-07 08:53:39  AB123  fail

Пример https://www.db -fiddle.com / f / 9B2LzaAvwhFz1QRN53moQU / 4

Ответы [ 3 ]

0 голосов
/ 15 апреля 2019

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

Input

CREATE TABLE #Data (
    Id int,
    [Date] datetime,
    Msg varchar(5)
)
INSERT INTO #Data
    (Id, [Date], Msg)
VALUES
    (1, '2019-04-11T10:14:02.773', 'AB123'),      
    (2, '2019-04-11T10:14:02.647', 'CD123'),      
    (3, '2019-04-11T10:11:03.670', 'AB123'),      
    (4, '2019-04-11T10:11:03.500', 'CD123'),     
    (5, '2019-04-10T09:53:39.743', 'AB123'),
    (6, '2019-04-10T09:52:39.743', 'AB123')

Заявление

SELECT t.Id, t.[Date], t.[Msg]
FROM (
    SELECT 
        Id, 
        [Date], 
        Msg, 
        LEAD(Msg) OVER (ORDER BY [Date] DESC) AS NextMsg
    FROM #Data  
) t
WHERE t.Msg LIKE '%AB%' AND ((t.NextMsg NOT LIKE '%CD%') OR (t.NextMsg IS NULL))
ORDER BY t.[Date] DESC

выход

Id  Date                Msg
5   10/04/2019 09:53:39 AB123
6   10/04/2019 09:52:39 AB123
0 голосов
/ 15 апреля 2019

Я подозреваю, что вы хотите найти значения "AB", которые не имеют значения "CD" в течение определенного периода времени - скажем, 1 секунда или 1 минута.

Если это так, используйте not exists:

выберите т. * от т где t.msg вроде 'AB%' и не существует (выберите 1 от t t2 где t2.msg вроде 'CD%' и t2.date = dateadd (секунда, -10, t.date) );

0 голосов
/ 15 апреля 2019

если я угадаю, что вы хотите, это будет работать:

select a.*,case when regexp_like(a.Msg,'(.)*AB(.)*')=1 or
regexp_like(a.Msg,'(.)*CD(.)*')=1 then 'IsSuccess' 
when regexp_like(a.Msg,'(.)*EF(.)*')=1 then 'IsFail'
else null end  status from table1 a

check https://www.db -fiddle.com / f / 9B2LzaAvwhFz1QRN53moQU / 0

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