You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite按分组取N行:如何为B列各不同值取3条随机行

解决SQLite中按列分组提取随机行的问题

嘿,这个需求我太熟悉了!要给B列每个不同值各提取3条随机行,不用提前知道B列的具体取值,咱们用SQLite的窗口函数就能轻松搞定,这也是最推荐的方案。

方法一:使用窗口函数(推荐,SQLite 3.25.0+)

窗口函数是处理这类分组统计需求的利器,代码简洁且效率高:

SELECT *
FROM (
    SELECT 
        *,
        -- 按B列分组,每组内随机排序后给行编号
        ROW_NUMBER() OVER (PARTITION BY B ORDER BY RANDOM()) AS row_num
    FROM your_table_name -- 替换成你的表名
) AS grouped_data
WHERE row_num <= 3; -- 只保留每组前3条随机行

代码解释:

  • PARTITION BY B:把表中的数据按B列的不同取值分成若干组;
  • ORDER BY RANDOM():让每组内的行随机打乱顺序;
  • ROW_NUMBER():给每组内的行从1开始依次编号;
  • 外层筛选row_num <=3,就能保证每个B值最多有3条随机行(如果某个B值的总行数不足3,就会返回所有行)。

方法二:兼容旧版本SQLite(无窗口函数支持)

如果你的SQLite版本比较老(低于3.25.0),窗口函数用不了,可以试试关联子查询的方式:

SELECT t1.*
FROM your_table_name t1
WHERE (
    -- 统计当前B值分组中,行ID大于等于当前行的行数
    SELECT COUNT(*)
    FROM your_table_name t2
    WHERE t2.B = t1.B AND t2.rowid >= t1.rowid
) <= 3
ORDER BY t1.B, RANDOM(); -- 最后按B列和随机值排序,保证随机性

这个方法利用SQLite默认的rowid来做统计,虽然能实现需求,但效率比窗口函数低一些,适合旧版本环境使用。

内容的提问来源于stack exchange,提问作者fortea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:02:44