SQL топ-3 самых последних записей по группам

#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;