我觉得这不是一个问题,但我一直在寻找一个大部分时间无法解决的解决方案。我见过的其他解决方案似乎没有帮助我获得非唯一值的列以及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
的最新条目,但如果我使用聚合函数或分组,然后我无法保留ID
或value
列以坚持所选的最大行。完全有可能我只是误解了聚合函数的工作原理。
到目前为止的进展
我到过的最好的地方就像是
with dataInDateRange as (
select *
from #historicalData hd
where hd.date < getdate() - 30
)
select ???, max(date)
from dataInDateRange
group by source
但是我没有看到如何在不以某种方式保留每个date
最大source
的行的唯一ID的情况下执行此操作,以便我可以返回并总结数字
感谢很棒的人提供任何帮助/指导/课程
答案 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