Group By 和日期数据的 Over 子句

Group By with an Over Clause for Date data

在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 文件。

感谢您抽出宝贵时间。

从现有查询开始,您可以通过 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