获取表中的下一条记录

时间:2020-01-29 07:14:27

标签: sql oracle

我有下表

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中不起作用

结果应如下所示:

enter image description here

3 个答案:

答案 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)

DEMO HERE

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'

如果上一个城市不是第三个城市,则为新逻辑-

DEMO HERE

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>

干杯!