MySQL随机排序分区
表1在我的数据库中有3列:id、category、timestamp。我需要查询每个类别中最新的3行:MySQL随机排序分区,mysql,sql,select,Mysql,Sql,Select,表1在我的数据库中有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 现在我需要从结果中随机选择10个分区。
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行。如何做到这一点?有多种方法。一是:
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只会使结果看起来随机。如果您希望每个类别都是真正随机的,这里有一种方法:
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;
非常感谢!但是每次我运行这个查询时,每个分区的catnum值都不会改变,因此结果是常量。@Soheil。这可能是一个特性,但您现在可以对md5:md5concatcatcatcategory添加盐。