#mysql #sql #apache-spark
#mysql #sql #apache-spark
Вопрос:
У меня есть таблица со столбцом даты и столбцом строки. Я пытаюсь отфильтровать столбец string по самым последним 3 записям.
---------- --------------
| date | string |
---------- --------------
|2000-11-14| AAA|
|2009-11-07| AAA|
|2020-11-20| AAA|
|2019-11-07| AAA|
|2018-11-07| AAA|
|2020-11-22| BBB|
|2019-11-20| BBB|
|2018-11-20| BBB|
|2014-11-21| BBB|
|2016-11-22| CCC|
|2017-11-08| CCC|
|2018-11-07| CCC|
|2019-11-22| CCC|
|2020-11-09| CCC|
|2020-11-11| DDD|
---------- --------------
Итоговая таблица будет выглядеть следующим образом:
---------- --------------
| date | string |
---------- --------------
|2020-11-20| AAA|
|2019-11-07| AAA|
|2018-11-07| AAA|
|2020-11-22| BBB|
|2019-11-20| BBB|
|2018-11-20| BBB|
|2020-11-09| CCC|
|2019-11-22| CCC|
|2018-11-07| CCC|
|2020-11-11| DDD|
---------- --------------
Я не думаю, что могу использовать MAX(date)
здесь по группам, так как я пытаюсь получить топ-3 самых последних записей (не топ-1).
Комментарии:
1. Вы используете MySQL или Spark? Это не одно и то же.
2. Извините, я использую Spark
Ответ №1:
ROW_NUMBER
Аналитическая функция особенно хорошо подходит для решения проблем такого типа:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY string ORDER BY date DESC) rn
FROM yourTable
)
SELECT date, string
FROM cte
WHERE rn <= 3;