Как выбрать дату и предыдущую дату - PullRequest
0 голосов
/ 30 мая 2019

У меня есть таблица реферальных записей с начальной и конечной датами.Если у человека были предыдущие рефералы, мне нужно получить начальную и конечную дату реферала, предшествующую текущему.

Любые идеи будут высоко оценены!

Пример того, на что я надеюсьдостижения

Per ID    Ref ID    Refrl_Start_D    Refrl_End_D    Prev_Refrl_S    Prev_Refrl_S
1         5         10/10/2018       Null           01/02/2018      03/03/2018
2         4         05/04/2018       Null           01/01/2017      01/03/2017
1         3         01/02/2018       03/03/2018     02/01/2017      20/01/2017
1         2         02/01/2018       20/01/2018     Null            Null
2         1         01/01/2018       01/03/2018     Null            Null

Попытка добавления рейтинга Calc, сгруппированного по человеку.Мой план состоял в том, чтобы создать еще одну таблицу со смещением на 1 и объединить их (т.е. объединить реферал 5 с 4).Однако я не мог понять, как получить правильное соединение.

SELECT DIM_PERSON_ID,
       FACT_REFERRAL_ID,
       REFRL_START_DTTM,
       REFRL_END_DTTM
FROM FACT_REFERRALS;

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Вы можете использовать LAG здесь

SELECT DIM_PERSON_ID,
       FACT_REFERRAL_ID,
       REFRL_START_DTTM,
       REFRL_END_DTTM
       PrevStart = LAG(REFRL_START_DTTM)
                       OVER(PARTITION BY DIM_PERSON_ID 
                           ORDER BY REFRL_START_DTTM DESC),
       PrevEnd = LAG(REFRL_END_DTTM)
                     OVER(PARTITION BY DIM_PERSON_ID 
                         ORDER BY REFRL_END_DTTMDESC)
FROM FACT_REFERRALS R;
0 голосов
/ 30 мая 2019

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

WITH RANKED_REFERRALS AS (
  SELECT DIM_PERSON_ID,
         FACT_REFERRAL_ID,
         REFRL_START_DTTM,
         REFRL_END_DTTM,
         ROW_NUMBER() OVER(PARTITION BY DIM_PERSON_ID ORDER BY REFRL_START_DATE) AS ROWNUM
  FROM FACT_REFERRALS
)
SELECT A.DIM_PERSON_ID,
       A.ACT_REFERRAL_ID,
       A.REFRL_START_DTTM,
       A.REFRL_END_DTTM,
       B.REFRL_START_DTTM,
       B.REFRL_END_DTTM
FROM RANKED_REFERRALS A
LEFT JOIN RANKED_REFERRALS B ON B.DIM_PERSON_ID = A.DIM_PERSON_ID AND B.ROWNUM = A.ROWNUM - 1
...