Получить следующую запись в таблице - PullRequest
1 голос
/ 29 января 2020

У меня есть следующая таблица

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

результат кода

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

Этот код перехватывает сотрудника по его пути движения (например, emp_id: 2258325) 1 - Лондон 2 - любой другой город 3 - Лондон

Он не будет работать нормально, если движение сотрудник, подобный следующему 1 - Лондон 2 - любой другой город 3 - любой другой город 4 - Лондон

Я хочу, чтобы результат был похож на

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

Любое предложение, пожалуйста?


 WITH YOUR_TABLE (EMP_ID,
                 DATETIME_OF_MOVEMENT,
                 CITY,
                 RANK_)
     AS (SELECT 2258325,
                '1/18/2020 5:37',
                'London',
                1
           FROM DUAL
         UNION ALL
         SELECT 2258325,
                '1/19/2020 11:01',
                'Manchester',
                2
           FROM DUAL
         UNION ALL
         SELECT 2258325,
                '1/20/2020 15:06',
                'London',
                3
           FROM DUAL
         UNION ALL
         SELECT 2656700,
                '1/20/2020 23:59',
                'London',
                1
           FROM DUAL
         UNION ALL
         SELECT 2656700,
                '1/21/2020 6:48',
                'Manchester',
                2
           FROM DUAL
         UNION ALL
         SELECT 2656700,
                '1/21/2020 6:48',
                'Liverpool',
                3
           FROM DUAL
         UNION ALL
         SELECT 2656700,
                '1/26/2020 10:47',
                'London',
                4
           FROM DUAL
         UNION ALL
         SELECT 6631583,
                '1/18/2020 18:00',
                'London',
                1
           FROM DUAL
         UNION ALL
         SELECT 6631583,
                '1/19/2020 14:25',
                'Manchester',
                2
           FROM DUAL
         UNION ALL
         SELECT 6631583,
                '1/20/2020 8:53',
                'Liverpool',
                3
           FROM DUAL
         UNION ALL
         SELECT 6631583,
                '1/20/2020 14:48',
                'Manchester',
                4
           FROM DUAL
         UNION ALL
         SELECT 6631583,
                '1/21/2020 11:34',
                'London',
                5
           FROM DUAL
           UNION ALL
         SELECT 6631583,
                '1/22/2020 14:48',
                'Manchester',
                6
           FROM DUAL
         UNION ALL
         SELECT 6631583,
                '1/24/2020 11:34',
                'London',
                7
           FROM DUAL)   -- YOUR QUERY STARTS FROM HERE   SELECT EMP_ID,
         MAX (CASE WHEN MINRN = RANK_ THEN DATETIME_OF_MOVEMENT END)
            AS first_movement,
         MAX (CASE WHEN MINRN = RANK_ THEN CITY END) AS first_CITY,
         MAX (CASE WHEN MINRN + 1 = RANK_ THEN DATETIME_OF_MOVEMENT END)
            AS SECOND_movement,
         MAX (CASE WHEN MINRN + 1 = RANK_ THEN CITY END) AS SECOND_CITY,
         MAX (CASE WHEN MAXRN = RANK_ THEN DATETIME_OF_MOVEMENT END)
            AS THIRD_movement,
         MAX (CASE WHEN MAXRN = RANK_ THEN CITY END) AS THIRD_CITY
    FROM (SELECT T.*,
                 MAX (CASE WHEN CITY = 'London' THEN RANK_ END)
                    OVER (PARTITION BY EMP_ID)
                    AS MAXRN,
                 MIN (CASE WHEN CITY = 'London' THEN RANK_ END)
                    OVER (PARTITION BY EMP_ID)
                    AS MINRN
            FROM YOUR_TABLE T)    WHERE MAXRN - MINRN > 1 GROUP BY EMP_ID;

проверить это не работает @ Teja sh

результат должен быть таким:

enter image description here

Ответы [ 3 ]

0 голосов
/ 29 января 2020

Вы можете попробовать этот скрипт ниже. Но это вернет только одну строку, так как только у одной ПУОС есть город Лондон, где ранг = 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'

Новые логики c если последний город не третий город-

ДЕМО ЗДЕСЬ

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'
0 голосов
/ 29 января 2020

Я думаю, вам нужна запись, начиная с Лондона, затем следующей записи и последней записи в Лондоне. Вы можете использовать комбинацию условного агрегата и аналитической функции следующим образом:

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>

Cheers !!

0 голосов
/ 29 января 2020
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, но, возможно, полезно. пожалуйста, дайте мне знать, если это работает для вас.

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