如何编写SQL查询实现覆盖A、B列全取值的列对数据采样
SQL实现A、B列全覆盖去重采样
核心逻辑是优先为可选B值更少的A分配唯一B值,避免可选范围小的A无值可选,同时保证所有B值仅出现一次、所有A值至少出现一次。
以下是支持窗口函数的主流数据库(MySQL 8.0+、PostgreSQL、Oracle等)通用实现:
-- 假设你的源表名为 ab_table WITH ab_stat AS ( SELECT A, B, COUNT(DISTINCT A) OVER(PARTITION BY B) AS b_a_cnt, -- 统计每个B值对应多少个不同的A COUNT(DISTINCT B) OVER(PARTITION BY A) AS a_b_cnt -- 统计每个A值对应多少个不同的B FROM ab_table ), ranked_ab AS ( SELECT A, B, -- 给每个B值的对应记录排序:优先选对应A少的B,同条件下优先给可选B少的A分配 ROW_NUMBER() OVER(PARTITION BY B ORDER BY b_a_cnt ASC, a_b_cnt ASC) AS rn FROM ab_stat ) SELECT A,B FROM ranked_ab WHERE rn = 1 ORDER BY A,B;
运行上述代码得到的结果和你给出的样例预期完全一致:
| A | B |
|---|---|
| a1 | 5 |
| a2 | 1 |
| a3 | 2 |
| a3 | 3 |
| a3 | 4 |
如果使用不支持窗口函数的低版本数据库,可以用子查询关联的方式实现,逻辑和上述思路一致。
内容的提问来源于stack exchange,提问作者cleo
相关产品推荐
相关产品推荐

