SQL Server 找出每种产品净收入超过10万美元的最早日期

ibrsph3r  于 2023-02-03  发布在  其他
关注(0)|答案(1)|浏览(98)

假设我的SQL表有4列:Product、Date、Net_Income和Cumulative_Net_Income。我想添加第五列,显示每个产品的第一个日期,其中累计净收入超过10万美元。
我最初的想法是使用创建一个临时表

Select Product,
      min(Date)
From Table
Where Cumulative_Net_Income > '100,000'
Group By Product

然后可以将此表联接回原始表。
然而,有没有一种更简单或更容易的方法,我不必创建单独的表之前,联接回来?

mwg9r5ms

mwg9r5ms1#

我不知道这是可能的,直到我尝试了它,但条件聚合可以与窗口函数相结合,以获得您的结果。
“条件聚合”是一个非正式术语,指的是将CASE表达式放入聚合函数(如MIN()SUM()),以选择性地包括或排除考虑的值。窗口函数是在最终select中的OVER(...)子句定义的值范围上计算的聚集计算。将两者放在一起,我们可以在每个不同产品的上下文中查询Cumulative_Net_Income超过100000的最小日期。

Select *,
    Min(Case When Cumulative_Net_Income > 100000 Then Date End)
        Over(Partition BY PD.Product) AS HundredGrandDate
From ProductData
Order By Product, Date

请参阅this db<>fiddle,它包含了上述内容以及您最初提出的使用与原始数据连接的单独的最小日期计算的方法。我不知道一种形式是否比另一种形式具有任何性能优势。
使用一些任意的测试数据,产生以下结果:
| 产品|日期|净收入|累计净收入|百元大日期|
| - ------|- ------|- ------|- ------|- ------|
| 美国汽车协会|2023年1月1日|一万|一万|2023年1月4日|
| 美国汽车协会|2023年1月2日|三万|四万|2023年1月4日|
| 美国汽车协会|2023年1月3日|五万|九万|2023年1月4日|
| 美国汽车协会|2023年1月4日|七万|十六万|2023年1月4日|
| 美国汽车协会|2023年1月5日|九万|二十五万|2023年1月4日|
| bbb|2023年1月1日|五万|五万|2023年1月3日|
| bbb|2023年1月2日|五万|十万|2023年1月3日|
| bbb|2023年1月3日|五万|十五万|2023年1月3日|
| bbb|2023年1月4日|五万|二十万|2023年1月3日|
| 气候变化中心|2023年1月1日|一千万|一千万|零|
| 气候变化中心|2023年1月2日|一千万|二千万元|零|
| 气候变化中心|2023年1月3日|一千万|三千万|零|
| 气候变化中心|2023年1月4日|一千万|四千万|零|
| 气候变化中心|2023年1月5日|一千万|五千万|零|
(In回想起来,由于>条件,我应该调用结果列OverHundredGrandDate。)

相关问题