SQL如何获取单列distinct值及对应另一列的任意关联行数据
问题描述
如何查询单列的distinct值,同时展示同一行中另一列的任意一个对应值?具体需求如下:
- 查询返回的行数应当与
permission列的distinct值数量一致,本示例中为2行 - 当
permission列值为select时,对应行的username列可返回Alice或Bob;当permission列值为insert时,对应行的username列可返回Carol、Alice、Bob或David - 允许每次查询返回不同的
username值,无需考虑性能,单表数据量仅为几十行级别
示例表结构(users_and_permissions)
| username | permission |
|---|---|
| Alice | select |
| Bob | select |
| Carol | insert |
| Alice | insert |
| Bob | insert |
| David | insert |
合法输出参考
| username | permission |
|---|---|
| Alice | select |
| Carol | insert |
实现方案
PostgreSQL 最简写法
直接用DISTINCT ON语法即可,会自动取每个permission分组的第一条数据:
SELECT DISTINCT ON (permission) username, permission FROM users_and_permissions;
如果需要随机取对应username,可以调整排序规则:
SELECT DISTINCT ON (permission) username, permission FROM users_and_permissions ORDER BY permission, random();
全数据库兼容通用写法
用MIN/MAX聚合函数随便取一个对应值即可:
SELECT MIN(username) AS username, permission FROM users_and_permissions GROUP BY permission;
如果需要随机取值,可以结合各数据库的随机函数实现,比如MySQL版本:
SELECT SUBSTRING_INDEX(GROUP_CONCAT(username ORDER BY RAND()), ',', 1) AS username, permission FROM users_and_permissions GROUP BY permission;
内容的提问来源于stack exchange,提问作者wmeitzen
相关产品推荐
相关产品推荐

