You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按product_id分组,基于year获取对应最早的name字段值?

需求

针对每个product_id,获取该产品最早年份(year列)对应的名称(name列)值。

数据表结构与数据

yearnameproduct_idinitial_name
2016Pepsi.123456Pepsi.
2017Pepsi co.123456Pepsi.
2017Cola567890Cola
2018Coca-Cola567890Cola
2019Coca-Colas567890Cola

现有代码优化

你当前的代码已经实现了部分逻辑,但可以用更简洁的窗口函数直接完成需求,避免子查询加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:27:30