#mysql #sql
Вопрос:
table1
имеет 3 столбца в моей базе данных: id
, category
, timestamp
. Мне нужно запросить последние 3 строки из каждой категории:
WITH ranked_rows AS
(SELECT t.*, ROW_NUMBER() OVER (PARTITION BY category ORDER BY t.timestamp DESC) AS rn
FROM table1 AS t)
SELECT ranked_rows.* FROM ranked_rows WHERE rn<=3
теперь мне нужно добавить еще одно условие: select only from the partitions which have at least 3 rows
. как добавить это условие?
Ответ №1:
вот еще один способ:
select * from (
SELECT t.*
, ROW_NUMBER() OVER (PARTITION BY category ORDER BY t.timestamp DESC) AS rn
, count(*) OVER (PARTITION BY category) AS cnt
FROM table1 AS t
) t
WHERE rn<=3 and cnt>= 3
Ответ №2:
Вы можете создать еще один CTE только из категорий, соответствующих вашему состоянию, а затем присоединиться к нему:
WITH ranked_rows AS
(
SELECT t.*, ROW_NUMBER() OVER (PARTITION BY category ORDER BY t.timestamp DESC) AS rn
FROM table1 AS t
),
categories AS
(
SELECT category
FROM table1
GROUP BY category
HAVING COUNT(*) >= 3
)
SELECT r.* FROM ranked_rows AS r
JOIN categories AS c USING (category)
WHERE r.rn <= 3;