MySQL 随机排序分区

时间:2021-05-25 16:34:09

标签: mysql sql select

table1 在我的数据库中有 3 列:idcategorytimestamp。我需要从每个类别中查询最新的 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

现在我需要从结果中随机选择 10 个分区(请注意每个分区有 3 行)。怎么做?

2 个答案:

答案 0 :(得分:1)

有多种方法。一种是:

WITH ranked_rows AS (
      SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY category ORDER BY t.timestamp DESC) AS seqnum,
             DENSE_RANK() OVER (ORDER BY MD5(category)) as catnum
      FROM table1 t
     )
SELECT ranked_rows.*
FROM ranked_rows
WHERE seqnum <= 3 AND catnum <= 10;

md5() 只是让结果看起来是随机的。

答案 1 :(得分:1)

如果您想要每个类别的真正随机,这是一种方法:

with categorycte as (
  select category , rand() randomcatid
  from table1
  group by category
),ranked_rows AS
(
  SELECT t.*
  , ROW_NUMBER() OVER (PARTITION BY category ORDER BY t.timestamp DESC) AS rn
  , dense_rank() over (order by randomcatid) catnum
FROM table1 AS t
join categorycte c on t.category = c.category
)
SELECT ranked_rows.* FROM ranked_rows 
WHERE rn<=3 and catnum <= 10;