一列上的聚合函数,另一列上的聚合函数,使第三列不受影响

时间:2016-12-05 21:25:03

标签: sql-server group-by aggregate-functions

我觉得这不是一个问题,但我一直在寻找一个大部分时间无法解决的解决方案。我见过的其他解决方案似乎没有帮助我获得非唯一值的列以及group by和aggregate函数。

问题

我有一张历史数据表如下:

ID | source | value | date
---+--------+-------+-----------
1  | 12     | 10    | 2016-11-16
2  | 12     | 20    | 2015-11-16
3  | 12     | 30    | 2014-11-16
4  | 13     | 40    | 2016-11-16
5  | 13     | 50    | 2015-11-16
6  | 13     | 60    | 2014-11-16

我正在尝试在特定日期之前(在循环内获取不同范围)获取数据,然后获取按源分组的值的总和。例如,“在30天前获取所有记录,并获取唯一来源的值的总和,使用每个的最新日期条目”。

所以第一步是删除日期不在范围内的条目,例如轻松where date < getdate()-30来获取:

ID | source | value | date
---+--------+-------+-----------
2  | 12     | 20    | 2015-11-16
3  | 12     | 30    | 2014-11-16
5  | 13     | 50    | 2015-11-16
6  | 13     | 60    | 2014-11-16

现在我的问题是找到一种方法group by来源并获取max日期,然后在所有来源中总结结果。听到的想法是我们不知道最后一个条目何时,所以在指定日期之前我们获得所有记录,然后获取每个唯一来源的最新条目,并将这些条目相加以获得当时的总值。 / p>

所以下一步是使用最大日期按来源分组,结果是:

ID | source | value | date
---+--------+-------+-----------
2  | 12     | 20    | 2015-11-16
5  | 13     | 50    | 2015-11-16

然后最后一步是对值进行求和,然后重复此过程以获得多个日期的总和值,因此这将导致行

 value | date
-------+-----------
 70    | getdate() - 30

用于其余部分。

我被困的地方

我正在尝试按source进行分组,并使用date的最大值来获取每个唯一source的最新条目,但如果我使用聚合函数或分组,然后我无法保留IDvalue列以坚持所选的最大行。完全有可能我只是误解了聚合函数的工作原理。

到目前为止的进展

我到过的最好的地方就像是

with dataInDateRange as (
    select *
    from #historicalData hd
    where hd.date < getdate() - 30
)
select ???, max(date)
from dataInDateRange
group by source

但是我没有看到如何在不以某种方式保留每个date最大source的行的唯一ID的情况下执行此操作,以便我可以返回并总结数字

感谢很棒的人提供任何帮助/指导/课程

1 个答案:

答案 0 :(得分:2)

USE row_number()

with dataInDateRange as (
    select *
    from #historicalData hd
    where hd.date < getdate() - 30
), rows as (
    select *, 
           row_number() over (partition by source 
                              order by date desc) as rn
    from dataInDateRange
)
SELECT *
FROM rows 
WHERE rn = 1