SQL技术问询:如何实现单列DISTINCT且关联唯一的其他列数据?
解决方法
你当前的问题是DISTINCT是对整行数据去重,只要billing_city和invoice_id的组合不同,就会被保留,所以同一城市对应多个订单ID时,城市名会重复出现。要实现每个城市只显示一次并关联一个订单ID,有两种常用方案:
方案1:使用GROUP BY + 聚合函数
如果不关心具体取哪个订单ID,只想每个城市关联一个(比如最早或最晚的订单),可以用MIN()或MAX()聚合函数配合GROUP BY:
SELECT billing_city, MIN(invoice_id) AS invoice_id FROM invoice GROUP BY billing_city ORDER BY invoice_id;
- 用
MIN(invoice_id)会取每个城市对应的最小订单ID,换成MAX(invoice_id)则取最大的,根据你的需求选择即可。
方案2:使用窗口函数(更灵活)
如果需要自定义选择订单ID的规则(比如按订单日期排序取最新的),可以用窗口函数ROW_NUMBER():
SELECT billing_city, invoice_id FROM ( SELECT billing_city, invoice_id, -- 按城市分组,每组内按invoice_id排序,给行编号 ROW_NUMBER() OVER (PARTITION BY billing_city ORDER BY invoice_id) AS rn FROM invoice ) t WHERE rn = 1 -- 只取每组的第一行 ORDER BY invoice_id;
- 把
ORDER BY invoice_id改成你需要的排序字段(比如order_date DESC),就能按指定规则选择要保留的订单ID。
内容的提问来源于stack exchange,提问作者Viego
相关产品推荐
相关产品推荐

