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
在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