SQL: Фильтр самоконтроля в логистических движениях - PullRequest
0 голосов
/ 06 декабря 2018

Я работаю над набором данных, содержащим логистические движения вещей.При визуализации материала, который мы хотели бы отфильтровать, например, от A до A (это безумие возникает в наборе данных).

Скажем, у меня есть набор данных, выглядящий так: Оборудование содержит идентификатор материала, которыйперемещение, ИЗ и В складские помещения, TIME_FROM, когда материал был перемещен в склад FROM, и TIME_TO, когда материал был перемещен в склад TO.

EQUIPMENT   FROM_MAG   TO_MAG   TIME_FROM   TIME_TO
1           A          B        1           2
1           B          C        2           3
1           C          D        3           4
1           D          D        4           5
1           D          E        5           6 
1           E          F        6           7 
1           F          F        7           8 
1           F          F        8           9     
1           F          G        9           10 

Чем мне нужен вывод измой запрос без D -> D и двух движений F -> F, но с логическим продолжением временных столбцов:

EQUIPMENT   FROM_MAG   TO_MAG   TIME_FROM   TIME_TO
1           A          B        1           2
1           B          C        2           3
1           C          D        3           5

1           D          E        5           6 
1           E          F        6           9 


1           F          G        9           10 

Я пытался использовать подобные запросы, но это не дает мнежелаемый результат.Кстати, я работаю над SAP HANA.

SELECT
EQUIPMENT,
FROM_MAG,
TO_MAG,
min(TIME_FROM),
max(TIME_TO)

FROM MOVEMENTS

GROUP BY EQUIPMENT,
FROM_MAG,
TO_MAG;

Создание оператора для SQL:

CREATE TABLE IF NOT EXISTS MOVEMENTS(
EQUIPMENT NVARCHAR(1) NOT NULL PRIMARY KEY
,FROM_MAG      NVARCHAR(1) NOT NULL
,TO_MAG        NVARCHAR(1) NOT NULL
,TIME_FROM NVARCHAR(1) NOT NULL
,TIME_TO   NVARCHAR(2) NOT NULL
);
INSERT INTO MOVEMENTS(EQUIPMENT,FROM_MAG,TO_MAG,TIME_FROM,TIME_TO) VALUES 
(N'1',N'A',N'B',N'1',N'2');
INSERT INTO MOVEMENTS(EQUIPMENT,FROM_MAG,TO_MAG,TIME_FROM,TIME_TO) VALUES 
(N'1',N'B',N'C',N'2',N'3');
INSERT INTO MOVEMENTS(EQUIPMENT,FROM_MAG,TO_MAG,TIME_FROM,TIME_TO) VALUES 
(N'1',N'C',N'D',N'3',N'4');
INSERT INTO MOVEMENTS(EQUIPMENT,FROM_MAG,TO_MAG,TIME_FROM,TIME_TO) VALUES 
(N'1',N'D',N'D',N'4',N'5');
INSERT INTO MOVEMENTS(EQUIPMENT,FROM_MAG,TO_MAG,TIME_FROM,TIME_TO) VALUES 
(N'1',N'D',N'E',N'5',N'6');
INSERT INTO MOVEMENTS(EQUIPMENT,FROM_MAG,TO_MAG,TIME_FROM,TIME_TO) VALUES 
(N'1',N'E',N'F',N'6',N'7');
INSERT INTO MOVEMENTS(EQUIPMENT,FROM_MAG,TO_MAG,TIME_FROM,TIME_TO) VALUES 
(N'1',N'F',N'F',N'7',N'8');
INSERT INTO MOVEMENTS(EQUIPMENT,FROM_MAG,TO_MAG,TIME_FROM,TIME_TO) VALUES 
(N'1',N'F',N'F',N'8',N'9');
INSERT INTO MOVEMENTS(EQUIPMENT,FROM_MAG,TO_MAG,TIME_FROM,TIME_TO) VALUES 
(N'1',N'F',N'G',N'9',N'10');

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Я использовал это, и теперь это работает:

WITH A AS(
SELECT EQUIPMENT,
     FROM_MAG,
     TO_MAG,
     TIME_FROM,
     TIME_FROM,
     TIME_TO

FROM MOVEMENTS
WHERE FROM_MAG<>TO_MAG
ORDER BY TO_NUMBER(TIME_TO))

SELECT EQUIPMENT,
     FROM_MAG,
     TO_MAG,
     TIME_FROM,
     IFNULL(LEAD(TIME_FROM) OVER(PARTITION BY EQUIPMENT ORDER BY TO_NUMBER(TIME_TO)), 
     TIME_TO) TIME_TO
FROM A;
0 голосов
/ 06 декабря 2018

Проверил ваш запрос, я не думаю, что есть необходимость в FROM_MAG в GROUP BY.Я проверил это в MySql, давая желаемый результат.

SELECT
EQUIPMENT,
FROM_MAG,
TO_MAG,
min(TIME_FROM),
max(TIME_TO)
FROM MOVEMENTS
GROUP BY EQUIPMENT,
TO_MAG
...