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

SQL如何获取单列distinct值及对应另一列的任意关联行数据

问题描述

如何查询单列的distinct值,同时展示同一行中另一列的任意一个对应值?具体需求如下:

  • 查询返回的行数应当与permission列的distinct值数量一致,本示例中为2行
  • 当permission列值为select时,对应行的username列可返回Alice或Bob;当permission列值为insert时,对应行的username列可返回Carol、Alice、Bob或David
  • 允许每次查询返回不同的username值,无需考虑性能,单表数据量仅为几十行级别

示例表结构(users_and_permissions)

usernamepermission
Aliceselect
Bobselect
Carolinsert
Aliceinsert
Bobinsert
Davidinsert

合法输出参考

usernamepermission
Aliceselect
Carolinsert

实现方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:30:00