如何从itemlocation表中获取首个地址分组的全部数据?
解决方案
方法一:通用SQL(适配多数数据库)
先找到表中最小的date值,再关联原表取出该日期对应的所有记录:
SELECT il.* FROM itemlocation il WHERE il.date = (SELECT MIN(date) FROM itemlocation);
这个方法逻辑简单,适配MySQL、Oracle、PostgreSQL等多数数据库,刚好匹配你要取出最早日期分组下所有条目的需求。
方法二:窗口函数(支持窗口函数的数据库:MySQL8+、Oracle、PostgreSQL等)
用DENSE_RANK()给不同的date分组排名,再筛选出排名为1的所有记录:
SELECT item, address, date FROM ( SELECT item, address, date, DENSE_RANK() OVER (ORDER BY date) AS date_rank FROM itemlocation ) t WHERE date_rank = 1;
这里用DENSE_RANK是因为如果存在多个相同的最小日期,它们的排名都会是1,能确保所有对应记录都被取出;如果用ROW_NUMBER(),会给每个记录单独编号,只能拿到单条结果,不符合需求。
你的原SQL问题说明
你写的SQL存在两个明显问题:
group by address会强制聚合每个address的记录,只能返回每个地址的单条结果,不符合你要取分组内所有条目的需求;- 子查询里没有定义
group_number字段,外层的where group_number <=1会触发语法错误。
内容的提问来源于stack exchange,提问作者SwiftMango
相关产品推荐
相关产品推荐

