如何按product_id分组,基于year获取对应最早的name字段值?
需求
针对每个product_id,获取该产品最早年份(year列)对应的名称(name列)值。
数据表结构与数据
| year | name | product_id | initial_name |
|---|---|---|---|
| 2016 | Pepsi. | 123456 | Pepsi. |
| 2017 | Pepsi co. | 123456 | Pepsi. |
| 2017 | Cola | 567890 | Cola |
| 2018 | Coca-Cola | 567890 | Cola |
| 2019 | Coca-Colas | 567890 | Cola |
现有代码优化
你当前的代码已经实现了部分逻辑,但可以用更简洁的窗口函数直接完成需求,避免子查询加CASE判断的冗余写法。
优化方案1:保留所有行并新增最早名称列
使用FIRST_VALUE窗口函数,按product_id分组后,每组内按year升序排序,直接取第一行的name作为该产品的最早名称:
SELECT *, FIRST_VALUE(name) OVER (PARTITION BY product_id ORDER BY year) AS initial_name FROM your_table;
这个写法一步到位,不需要嵌套子查询和条件判断,执行效率更高。
优化方案2:仅返回每个产品的最早名称(去重结果)
如果只需要每个product_id一行的结果,可以用ROW_NUMBER()筛选出每组的第一行:
SELECT product_id, name AS initial_name, year AS earliest_year FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY year) AS rn FROM your_table ) t WHERE rn = 1;
如果你用的是PostgreSQL,还可以用DISTINCT ON简化:
SELECT DISTINCT ON (product_id) product_id, name AS initial_name, year AS earliest_year FROM your_table ORDER BY product_id, year;
内容的提问来源于stack exchange,提问作者Norah Jones
相关产品推荐
相关产品推荐

