我有下表
malloc
我想要一个查询来获取在伦敦的雇员并返回伦敦。 射击位置应该是伦敦,第二是伦敦之后的第一个位置,第三位置应该是伦敦
我使用以下查询,但缺少一些员工
EMP_ID ,DATETIME_OF_MOVEMENT,CITY ,RANK
2258325 ,1/18/2020 5:37 ,London ,1
2258325 ,1/19/2020 11:01 ,Manchester ,2
2258325 ,1/20/2020 15:06 ,London ,3
2656700 ,1/20/2020 23:59 ,London ,1
2656700 ,1/21/2020 6:48 ,Manchester ,2
2656700 ,1/21/2020 6:48 ,Liverpool ,3
2656700 ,1/26/2020 10:47 ,London ,4
6631583 ,1/18/2020 18:00 ,London ,1
6631583 ,1/19/2020 14:25 ,Manchester ,2
6631583 ,1/20/2020 8:53 ,Liverpool ,3
6631583 ,1/20/2020 14:48 ,Manchester ,4
6631583 ,1/21/2020 11:34 ,London ,5
代码结果
select emp_id , date_of_movement as first_movement , city as first_city ,lead
(DATETIME_OF_MOVEMENT, 1) over ( partition by emp_id order by DATETIME_OF_MOVEMENT) as second_movement ,
lead (city , 1) over ( partition by emp_id order by DATETIME_OF_MOVEMENT) as second_city ,
lead (DATETIME_OF_MOVEMENT, 2) over ( partition by emp_id order by DATETIME_OF_MOVEMENT) as third_movement ,
lead (city , 1) over ( partition by emp_id order by DATETIME_OF_MOVEMENT) as third_city ,
from table
此代码捕获员工的动向(例如,emp_id:2258325) 1-伦敦 2-任何其他城市 3-伦敦
如果员工的移动如下所示,将无法正常工作 1-伦敦 2-任何其他城市 3-任何其他城市 4-伦敦
我希望结果像
CUSTOMER_ID,first_movement ,first_city,second_movment ,second_movement,third_movment ,third_city
2258325 ,1/18/2020 5:37 ,London ,1/19/2020 11:01,Manchester ,1/20/2020 15:06,London
2656700 ,1/20/2020 23:59,London ,1/21/2020 6:48 ,Manchester ,1/21/2020 6:48 ,Liverpool
6631583 ,1/18/2020 18:00,London ,1/19/2020 14:25,Manchester ,1/20/2020 8:53 ,Liverpool
有什么建议吗?
CUSTOMER_ID,first_movement ,first_city,second_movement,second_city,third_movement ,third_city
2258325 ,1/18/2020 5:37 ,London ,1/19/2020 11:01,Manchester ,1/20/2020 15:06,London
2656700 ,1/20/2020 23:59,London ,1/21/2020 6:48 ,Manchester ,1/26/2020 10:47,London
6631583 ,1/18/2020 18:00,London ,1/19/2020 14:25,Manchester ,1/21/2020 11:34,London
检查这在@Tejash中不起作用
结果应如下所示:
答案 0 :(得分:0)
SELECT emp_id,
Lead (datetime_of_movement, 0)
OVER (
partition BY emp_id
ORDER BY datetime_of_movement ASC) AS first_movement,
Lead (city, 0)
OVER (
partition BY emp_id
ORDER BY datetime_of_movement ASC) AS first_city,
Lead (datetime_of_movement, 1)
OVER (
partition BY emp_id
ORDER BY datetime_of_movement ASC) AS second_movement,
Lead (city, 1)
OVER (
partition BY emp_id
ORDER BY datetime_of_movement ASC) AS second_city,
Lead (datetime_of_movement, 0)
OVER (
partition BY emp_id
ORDER BY datetime_of_movement DESC) AS third_movement,
Lead (city, 0)
OVER (
partition BY emp_id
ORDER BY datetime_of_movement DESC) AS third_city,
FROM table
WHERE frist_city = "London" AND third_city = "London"
我无法测试此SQL,但可能会有所帮助。请让我知道它是否适合您。
答案 1 :(得分:0)
您可以在下面的脚本中尝试此操作。但这只会返回唯一的行,因为只有一个EMP拥有排名为3的伦敦市(而且根据您的解释,您的关注点也位于3)
SELECT
DISTINCT A.EMP_ID CUSTOMER_ID,
A.DATETIME_OF_MOVEMENT first_movement ,A.city first_city,
B.DATETIME_OF_MOVEMENT secondt_movement,B.city second_city,
C.DATETIME_OF_MOVEMENT third_movement ,C.city third_city
FROM your_table A
INNER JOIN your_table B ON A.Rank = B.Rank - 1 AND A.EMP_ID = B.EMP_ID
INNER JOIN your_table C ON A.Rank = C.Rank - 2 AND A.EMP_ID = C.EMP_ID
WHERE A.RANK = 1
AND C.City = 'London'
如果上一个城市不是第三个城市,则为新逻辑-
WITH CTE AS
(
SELECT A.EMP_ID,A.DATETIME_OF_MOVEMENT,A.CITY,A.RANK,
CASE WHEN A.RANK > 2 THEN 3 ELSE A.Rank END NEW_RANK
FROM your_table A
WHERE A.RANK IN (1,2)
OR A.RANK = (SELECT MAX(Rank) FROM your_table B WHERE B.EMP_ID = A.EMP_ID)
)
SELECT
A.EMP_ID CUSTOMER_ID,
A.DATETIME_OF_MOVEMENT first_movement ,A.city first_city,
B.DATETIME_OF_MOVEMENT secondt_movement,B.city second_city,
C.DATETIME_OF_MOVEMENT third_movement ,C.city third_city
FROM CTE A
INNER JOIN CTE B ON A.NEW_RANK = B.NEW_RANK - 1 AND A.EMP_ID = B.EMP_ID
INNER JOIN CTE C ON A.NEW_RANK = C.NEW_RANK - 2 AND A.EMP_ID = C.EMP_ID
WHERE A.NEW_RANK = 1
AND C.City = 'London'
答案 2 :(得分:0)
我认为您需要从伦敦开始的记录,然后是下一个记录和最后一个伦敦记录。您可以按以下方式使用条件聚合和分析功能的组合:
SQL> WITH YOUR_TABLE ( 2 EMP_ID, 3 DATETIME_OF_MOVEMENT, 4 CITY, 5 RANK 6 ) AS 7 ( 8 SELECT 2258325 ,'1/18/2020 5:37' ,'London' ,1 FROM DUAL UNION ALL 9 SELECT 2258325 ,'1/19/2020 11:01' ,'Manchester' ,2 FROM DUAL UNION ALL 10 SELECT 2258325 ,'1/20/2020 15:06' ,'London' ,3 FROM DUAL UNION ALL 11 SELECT 2656700 ,'1/20/2020 23:59' ,'London' ,1 FROM DUAL UNION ALL 12 SELECT 2656700 ,'1/21/2020 6:48' ,'Manchester' ,2 FROM DUAL UNION ALL 13 SELECT 2656700 ,'1/21/2020 6:48' ,'Liverpool' ,3 FROM DUAL UNION ALL 14 SELECT 2656700 ,'1/26/2020 10:47' ,'London' ,4 FROM DUAL UNION ALL 15 SELECT 6631583 ,'1/18/2020 18:00' ,'London' ,1 FROM DUAL UNION ALL 16 SELECT 6631583 ,'1/19/2020 14:25' ,'Manchester' ,2 FROM DUAL UNION ALL 17 SELECT 6631583 ,'1/20/2020 8:53' ,'Liverpool' ,3 FROM DUAL UNION ALL 18 SELECT 6631583 ,'1/20/2020 14:48' ,'Manchester' ,4 FROM DUAL UNION ALL 19 SELECT 6631583 ,'1/21/2020 11:34' ,'London' ,5 FROM DUAL 20 ) 21 -- YOUR QUERY STARTS FROM HERE 22 SELECT 23 EMP_ID, 24 MAX(CASE WHEN MINRN = RANK THEN DATETIME_OF_MOVEMENT END) AS first_movement, 25 MAX(CASE WHEN MINRN = RANK THEN CITY END) AS first_CITY, 26 MAX(CASE WHEN MINRN + 1 = RANK THEN DATETIME_OF_MOVEMENT END) AS SECOND_movement, 27 MAX(CASE WHEN MINRN + 1 = RANK THEN CITY END) AS SECOND_CITY, 28 MAX(CASE WHEN MAXRN = RANK THEN DATETIME_OF_MOVEMENT END) AS THIRD_movement, 29 MAX(CASE WHEN MAXRN = RANK THEN CITY END) AS THIRD_CITY 30 FROM 31 ( 32 SELECT T.*, 33 MAX(CASE WHEN CITY = 'London' THEN RANK END) OVER(PARTITION BY EMP_ID) AS MAXRN, 34 MIN(CASE WHEN CITY = 'London' THEN RANK END) OVER(PARTITION BY EMP_ID) AS MINRN 35 FROM YOUR_TABLE T 36 ) 37 WHERE MAXRN - MINRN > 1 38 GROUP BY EMP_ID; EMP_ID FIRST_MOVEMENT FIRST_CITY SECOND_MOVEMENT SECOND_CIT THIRD_MOVEMENT THIRD_CITY ---------- --------------- ---------- --------------- ---------- --------------- ---------- 2258325 1/18/2020 5:37 London 1/19/2020 11:01 Manchester 1/20/2020 15:06 London 2656700 1/20/2020 23:59 London 1/21/2020 6:48 Manchester 1/26/2020 10:47 London 6631583 1/18/2020 18:00 London 1/19/2020 14:25 Manchester 1/21/2020 11:34 London SQL>
干杯!