使用日期数据的 Over 子句分组依据
Posted
技术标签:
【中文标题】使用日期数据的 Over 子句分组依据【英文标题】:Group By with an Over Clause for Date data 【发布时间】:2020-11-17 16:10:33 【问题描述】:在 SQL 方面,我还是一名大三学生,我希望能在这方面得到您的帮助。
我有数据在一个月内累计汇总,我正在尝试获取与 ISOWeek 的最后一天匹配的值。
SELECT Date, [ISOWeek]
,SUM([Value]) OVER (PARTITION BY YEAR(Date), MONTH(Date) order by Date) AS [Value]
FROM [Demo].[MTD_Daily]
ORDER BY Date DESC
Date ISOWeek Value
2020-07-19 2029 1006353.56
2020-07-18 2029 951399.59
2020-07-17 2029 895296.1
2020-07-16 2029 843615.05
2020-07-15 2029 793697.11
2020-07-14 2029 743885.91
2020-07-13 2029 687345.41
2020-07-12 2028 631264.57
2020-07-11 2028 576558.97
2020-07-10 2028 519336.1
2020-07-09 2028 468372.56
2020-07-08 2028 423332.98
2020-07-07 2028 371895.4
2020-07-06 2028 318428.22
2020-07-05 2027 265560.11
2020-07-04 2027 214018.45
2020-07-03 2027 159850.71
2020-07-02 2027 108456.77
2020-07-01 2027 53559.46
我想要得到的是:
Date ISOWeek Value
2020-07-19 2029 1006353.56
2020-07-12 2028 631264.57
2020-07-05 2027 265560.11
这就是我所能得到的全部
SELECT MAX(Date) AS Date
,MAX([ISOWeek]) AS [ISOWeek]
,SUM(SUM([Value])) OVER (PARTITION BY YEAR(MAX(Date)), MONTH(MAX(Date)) ORDER by DAY(MAX(Date))) AS [Value]
FROM [Demo].[MTD_Daily]
GROUP BY ISOWeek
ORDER BY Date DESC
然而,这就是它产生的结果:
Date ISOWeek Value
2020-07-19 00:00:00 2029 1111193.86
2020-07-12 00:00:00 2028 736104.87
2020-07-05 00:00:00 2027 370400.41
如果有助于重现此数据,我可以提供包含此数据的 .csv 文件。
感谢您抽出宝贵时间。
【问题讨论】:
Larnu,我使用 OVER 子句每个月每天累积汇总我的数据。我能以不同的方式获得相同的结果吗?或者,我可以用它创建一个视图,并在其中 GROUP BY。我试图避免对此有 2 个视图。 所以你真的想要每周的最后一行?这回答了你的问题了吗? Retrieving last record in each group from database - SQL Server 2005/2008 很棒的拉努,我已经在这工作了几天了。我设法通过修改该帖子中的代码对其进行排序。非常感谢。 【参考方案1】:从您现有的查询开始,您可以在带有row_number()
的子查询中为每个ioweeek
降序排列date
的记录,然后使用该信息在外部查询中进行过滤:
selet date, isoweek, value
from (
select
date,
isoweek,
sum(value) over (partition by year(date), month(date) order by date) as value,
row_number() over(partition by isoweek order by date desc) rn
from demo.mtd_daily
) t
where rn = 1
order by date desc
【讨论】:
这正是我需要的 GMB。 Larnu 的帖子提到了非常相似的代码,这也有帮助。谢谢你们,你们太棒了。以上是关于使用日期数据的 Over 子句分组依据的主要内容,如果未能解决你的问题,请参考以下文章