0

我正在研究一个包含物品物流运动的数据集。在可视化这些东西时,我们希望过滤掉从例如 A 到 A 的运动(这种疯狂发生在数据集中)。

假设我有一个如下所示的数据集:设备包含正在移动的东西的 id,FROM 和 TO 储藏室,当东西被移动到 FROM 储藏室时的 TIME_FROM,以及当东西被移动到 TO 时的 TIME_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');
4

2 回答 2

0

我用过这个,现在它可以工作了:

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;
于 2018-12-06T13:39:42.190 回答
0

检查了您的查询,我认为 GROUP BY 中不需要 FROM_MAG。我在 MySql 中检查了这个,给出了想要的结果。

SELECT
EQUIPMENT,
FROM_MAG,
TO_MAG,
min(TIME_FROM),
max(TIME_TO)
FROM MOVEMENTS
GROUP BY EQUIPMENT,
TO_MAG
于 2018-12-06T08:12:54.167 回答