Значение из предыдущей строки в GROUP BY как столбец - PullRequest
1 голос
/ 03 июня 2019

У меня есть эта таблица:

+----------+-------------+-------------------+------------------+
|    userId|       testId|               date|              note|
+----------+-------------+-------------------+------------------+
| 123123123|            1|2019-01-22 02:03:00|               aaa|
| 123123123|            1|2019-02-22 02:03:00|               bbb|
| 123456789|            2|2019-03-23 02:03:00|               ccc|
| 123456789|            2|2019-04-23 02:03:00|               ddd|
| 321321321|            3|2019-05-23 02:03:00|               eee|
+----------+-------------+-------------------+------------------+

Хотел бы получить новейшую заметку (целую строку) для каждой группы userId и testId:

SELECT
    n.userId,
    n.testId,
    n.date,
    n.note
FROM 
    notes n
INNER JOIN (
    SELECT 
        userId,
        testId,
        MAX(date) as maxDate
    FROM 
        notes
    GROUP BY 
        userId,
        testId
) temp ON n.userId = temp.userId AND n.testId = temp.testId AND n.date = temp.maxDate

Это работает.

Но теперь я хотел бы также иметь предыдущую заметку в каждой строке:

+----------+-------------+-------------------+-------------+------------+
|    userId|       testId|               date|         note|previousNote|
+----------+-------------+-------------------+-------------+------------+
| 123123123|            1|2019-02-22 02:03:00|          bbb|         aaa|
| 123456789|            2|2019-04-23 02:03:00|          ddd|         ccc|
| 321321321|            3|2019-05-23 02:03:00|          eee|        null|
+----------+-------------+-------------------+-------------+------------+

Понятия не имею, как это сделать. Я слышал о функции LAG(), которая может быть полезна, но не нашел хороших примеров для моего случая.

Я бы хотел использовать его на фрейме данных в pyspark (если это важно)

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

использование lag() and row_number аналитическая функция

select userid,testid,date,note,previous_note
from
(select userid,testid,date,note,
lag(note)over(partition by useid,testid order by date) as previous_note,
row_number() over(partition by userid,testid order by date desc) rn
from table_name
) a where a.rn=1
1 голос
/ 03 июня 2019
select userid,testid,date,note,previous_note from
(select userid,testid,date,note,lead(note)
over(partition by userid,testid order by date desc) as previous_note,
row_number() over(partition by userid,testid order by date desc) srno
from Table_Name
) a where a.srno=1

Я надеюсь, что это даст вам правильный ответ, который вы хотите. это даст вам самую последнюю дату в качестве новой записи и предыдущую дату в виде previous_Note.

...