如何获取各唯一fk_customer对应最大pk_license的option_1值
解决License表的分组查询问题
嘿,我来帮你搞定这个SQL查询需求!首先明确你的目标:获取每个唯一fk_customer对应的最大pk_license的option_1值。先看看你之前尝试的SQL里存在的小问题:字段名写错了(原表是option_1你写成了opt_2,fk_customer写成了fk_station),而且分组逻辑也不对——我们只需要按fk_customer分组找最大pk_license,不需要把option_1加入分组。
下面给你两种靠谱的解决方案:
方案一:关联子查询(兼容大多数数据库)
这种方法先通过子查询拿到每个客户的最大pk_license,再关联原表获取对应的option_1值:
SELECT li.fk_customer, li.option_1 FROM License li INNER JOIN ( -- 子查询:按客户分组,拿到每个客户的最大pk_license SELECT fk_customer, MAX(pk_license) AS MaxLicense FROM License GROUP BY fk_customer ) groupedli ON li.fk_customer = groupedli.fk_customer AND li.pk_license = groupedli.MaxLicense;
方案二:窗口函数(适合支持窗口函数的数据库,如MySQL8+、PostgreSQL等)
用ROW_NUMBER()窗口函数可以更简洁地实现需求,每个客户组内按pk_license降序排序,取第一条就是最大的那条:
SELECT fk_customer, option_1 FROM ( SELECT fk_customer, option_1, -- 按客户分区,区内按pk_license降序排,给每条记录标序号 ROW_NUMBER() OVER (PARTITION BY fk_customer ORDER BY pk_license DESC) AS rn FROM License ) sub -- 取每个分区里序号为1的记录(即pk_license最大的那条) WHERE rn = 1;
拿你提供的测试数据验证,这两个查询都会返回正确结果:比如fk_customer=1对应的最大pk_license是30640,option_1为1;fk_customer=144对应的最大pk_license是30579,option_1为0,完全符合需求。
内容的提问来源于stack exchange,提问作者Peter Kipe
相关产品推荐
相关产品推荐

