使用日期数据的 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 子句分组依据的主要内容,如果未能解决你的问题,请参考以下文章

SQL - OVER 子句范围在 2 次之间

分组依据、IFNULL 和按日期排序

选择匹配日期到 min() 分组依据

sql数据库怎么实现分组并取每组的前1条语句,按日期排序?

如何使用两个日期范围进行计算(分区依据和之前)

如何在 AWS Redshift 数据库中获取过滤器和分组依据子句的子字符串