SQL按creation_date取首行:如何查询每个用户的首个order_id及对应日期
实现方案
以上需求可根据你使用的数据库类型选择以下对应方案,执行后均可得到你预期的查询结果:
方案1:窗口函数法(兼容性最好,支持所有现代SQL数据库)
适用场景:MySQL 8.0+、PostgreSQL、SQL Server、Spark SQL、Hive等支持窗口函数的数据库
SELECT User, order_id, `date` FROM ( SELECT User, order_id, `date`, -- 按用户分组,按日期升序排序,日期相同可再加order_id排序保证结果唯一 ROW_NUMBER() OVER (PARTITION BY User ORDER BY `date` ASC, order_id ASC) AS rn FROM user_orders -- 此处替换为你的实际表名 ) t WHERE rn = 1;
方案2:分组关联法(兼容旧版无窗口函数的数据库,如MySQL 5.x)
SELECT t1.User, t1.order_id, t1.`date` FROM user_orders t1 INNER JOIN ( -- 先查询每个用户的最早订单日期 SELECT User, MIN(`date`) AS first_date FROM user_orders GROUP BY User ) t2 ON t1.User = t2.User AND t1.`date` = t2.first_date -- 若同一用户同日期有多条订单,加以下逻辑保证只取最小order_id的一条 GROUP BY t1.User, t1.`date` HAVING t1.order_id = MIN(t1.order_id);
方案3:DISTINCT ON 语法(仅PostgreSQL支持,性能最优)
SELECT DISTINCT ON (User) User, order_id, `date` FROM user_orders ORDER BY User, `date` ASC, order_id ASC;
内容的提问来源于stack exchange,提问作者Nazar Hnid
相关产品推荐
相关产品推荐

