MySQL-условие размера раздела

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