SQL技术问询:无需临时表,获取各产品累计净利润超10万的首次日期
无需临时表的简便实现方法
你可以直接用窗口函数结合条件聚合来实现,不需要创建临时表再关联,一步到位生成目标列。
核心思路
针对每个产品分组,筛选出累计净利润首次突破10万美元的日期——本质是取该产品所有满足Cumulative_Net_Income > 100000的记录中的最小日期,通过窗口函数直接将这个值作为新列附加到每一行。
完整SQL语句
SELECT Product, Date, Net_Income, Cumulative_Net_Income, -- 针对每个产品,取满足条件的最小日期(首次突破日期) MIN(CASE WHEN CAST(REPLACE(Cumulative_Net_Income, ',', '') AS DECIMAL(18,2)) > 100000 THEN Date END) OVER (PARTITION BY Product) AS First_100k_Date FROM Your_Table;
关键细节说明
- 处理带逗号的数值字符串:你的原语句中用了
'100,000'字符串比较,这容易导致排序错误(比如字符串'99,999'会被认为比'100,000'大),所以先用REPLACE去掉逗号,再转成数值类型DECIMAL后比较。 - 窗口函数的作用:
PARTITION BY Product确保我们只在同一个产品的范围内计算最小日期;MIN()会自动忽略不满足条件的NULL值,最终返回该产品首次突破的日期。 - 兼容未突破的产品:如果某个产品从未达到10万美元累计净利润,
First_100k_Date会显示NULL,无需额外处理。
简化版(如果Cumulative_Net_Income是数值类型)
如果你的Cumulative_Net_Income本身就是数值类型(而非带逗号的字符串),可以简化为:
SELECT Product, Date, Net_Income, Cumulative_Net_Income, MIN(CASE WHEN Cumulative_Net_Income > 100000 THEN Date END) OVER (PARTITION BY Product) AS First_100k_Date FROM Your_Table;
内容的提问来源于stack exchange,提问作者user2864154
相关产品推荐
相关产品推荐

