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

无需WITH、变量或存储过程,按多字段组合均匀抽取SQL数据

问题描述

现有一张表,结构及示例数据如下:

NameProduct CodePayment TypeMember
BobCode AType 2Yes
KatCode BType 2Yes
GregCode CType 1No
DavidCode AType 1Yes
SimonCode AType 2Yes

该表共10000行数据,仅Name列为唯一列。需抽取120行数据,要求尽可能均匀分配到Product Code、Payment Type、Member三个字段的所有不同组合中。例如:若存在3种Product Code、2种Payment Type、2种Member值(共12种组合),则每种组合抽取10行。同时要求实现不能使用WITH语句、@变量或存储过程等。

解决方案

以下是符合要求的SQL实现:

SELECT Name, `Product Code`, `Payment Type`, Member
FROM (
    SELECT 
        Name, 
        `Product Code`, 
        `Payment Type`, 
        Member,
        ROW_NUMBER() OVER (PARTITION BY `Product Code`, `Payment Type`, Member ORDER BY RAND()) AS rn,
        (SELECT CEIL(120 / COUNT(DISTINCT CONCAT(`Product Code`, `Payment Type`, Member))) FROM your_table) AS target_per_group
    FROM your_table
) t
WHERE rn <= target_per_group
ORDER BY `Product Code`, `Payment Type`, Member
LIMIT 120;

实现说明

  • 使用ROW_NUMBER()窗口函数,按Product Code、Payment Type、Member的组合分区,通过ORDER BY RAND()随机排序后为每组内的行编号
  • 嵌套子查询计算每组需抽取的行数:用总目标行数120除以组合的唯一数量,CEIL()函数确保当无法整除时,部分组合多取1行,保证整体均匀分配
  • 最后通过WHERE rn <= target_per_group筛选每组内的指定行数,并用LIMIT 120确保最终结果恰好为120行
  • 全程未使用WITH语句、变量或存储过程,仅通过嵌套子查询实现需求

内容的提问来源于stack exchange,提问作者D.G. Redd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:22:46