SQL MAX(本周)和 MAX(上周)之间的差异
SQL Difference between MAX (from this week) and MAX (from last week)
在 Table 我有每天的里程数。
现在我想要一个每周给我英里数的查询。
所以我想我取了本周的 MAX 值和上周的 MAX 值,差异就是我的答案。
但是如何在查询中执行此操作?
我的 Table 看起来像:
Date Object Value
2020-01-03 Mileage 12500
2020-01-06 Mileage 12850
2020-01-07 Mileage 13020
2020-01-10 Mileage 13200
2020-01-14 Mileage 13660
2020-01-16 Mileage 13700
我的查询如下:
SELECT dbo.Getyearweek([Date]) as ThisWeek
,Object
,MAX([Value]) as ThisWeekMax
,(SELECT MAX([Value])
FROM [MyTable]
WHERE dbo.Getyearweek(dateadd(day, -7, [Date])) ) as LastWeekMax
,MAX([ThisWeekMax]) - MAX([LastWeekMax]) as Difference
FROM [MyTable]
WHERE [Date] > dateadd(year, -1, GetDate())
GROUP BY dbo.Getyearweek([Date]), Object
Getyearweek() 是一个函数,它给出给定日期的年份和周数作为结果。
对于日期 2020-01-03:2020_01
对于日期 2020-01-07:2020_02
等等
我希望得到这样的结果:
ThisWeek Object ThisWeekMax LastWeekMax Difference
2020_02 Mileage 13200 12500 700
2020_03 Mileage 13700 13200 500
使用lag()
:
SELECT dbo.Getyearweek([Date]) as ThisWeek, Object
MAX([Value]) as ThisWeekMax,
(value -
LAG(MAX([Value]) OVER (PARTITION BY Object ORDER BY dbo.Getyearweek([Date])) as prev_week_value
) as Difference
FROM [MyTable]
WHERE [Date] > dateadd(year, -1, GetDate())
GROUP BY dbo.Getyearweek([Date]), Object
我假设您在此 table 中有一个唯一标识符,因为您需要它才能加入。
SELECT ID, dbo.Getyearweek(x.[Date]) as ThisWeek
,x.Object
,MAX([x.Value]) as ThisWeekMax
,y.LastWeekMax
,x.ThisWeekMax - y.LastWeekMax As Difference
From (Select ID, Max([Value]) as LastWeekMax From [myTable]
Where dbo.Getyearweek(dateadd(day, -7, [Date])) )
Group By myTable.ID) As y Inner Join myTable as x
On x.ID = y.ID
WHERE [Date] > dateadd(year, -1, GetDate())
以下代码会对您有所帮助。我使用 DATEPART 获取周数。
select *,case when previousweekmax<>0 then thisweekmax-previousweekmax else 0 end as DIFF
from
(
select week,object,val as thisweekmax,
case when week >1 then (select max(value) from test where DATEPART ( ww , date )=week-1)
else 0 end as previousweekmax
from
(
select distinct DATEPART ( ww , date )as week,object,max(value) as val from test
group by DATEPART ( ww , date ),object
)tmp
)t
输出
week object thisweekmax previousweekmax DIFF
1 Mileage 12500 0 0
2 Mileage 13200 12500 700
3 Mileage 13700 13200 500
在 Table 我有每天的里程数。 现在我想要一个每周给我英里数的查询。 所以我想我取了本周的 MAX 值和上周的 MAX 值,差异就是我的答案。 但是如何在查询中执行此操作?
我的 Table 看起来像:
Date Object Value
2020-01-03 Mileage 12500
2020-01-06 Mileage 12850
2020-01-07 Mileage 13020
2020-01-10 Mileage 13200
2020-01-14 Mileage 13660
2020-01-16 Mileage 13700
我的查询如下:
SELECT dbo.Getyearweek([Date]) as ThisWeek
,Object
,MAX([Value]) as ThisWeekMax
,(SELECT MAX([Value])
FROM [MyTable]
WHERE dbo.Getyearweek(dateadd(day, -7, [Date])) ) as LastWeekMax
,MAX([ThisWeekMax]) - MAX([LastWeekMax]) as Difference
FROM [MyTable]
WHERE [Date] > dateadd(year, -1, GetDate())
GROUP BY dbo.Getyearweek([Date]), Object
Getyearweek() 是一个函数,它给出给定日期的年份和周数作为结果。 对于日期 2020-01-03:2020_01 对于日期 2020-01-07:2020_02 等等
我希望得到这样的结果:
ThisWeek Object ThisWeekMax LastWeekMax Difference
2020_02 Mileage 13200 12500 700
2020_03 Mileage 13700 13200 500
使用lag()
:
SELECT dbo.Getyearweek([Date]) as ThisWeek, Object
MAX([Value]) as ThisWeekMax,
(value -
LAG(MAX([Value]) OVER (PARTITION BY Object ORDER BY dbo.Getyearweek([Date])) as prev_week_value
) as Difference
FROM [MyTable]
WHERE [Date] > dateadd(year, -1, GetDate())
GROUP BY dbo.Getyearweek([Date]), Object
我假设您在此 table 中有一个唯一标识符,因为您需要它才能加入。
SELECT ID, dbo.Getyearweek(x.[Date]) as ThisWeek
,x.Object
,MAX([x.Value]) as ThisWeekMax
,y.LastWeekMax
,x.ThisWeekMax - y.LastWeekMax As Difference
From (Select ID, Max([Value]) as LastWeekMax From [myTable]
Where dbo.Getyearweek(dateadd(day, -7, [Date])) )
Group By myTable.ID) As y Inner Join myTable as x
On x.ID = y.ID
WHERE [Date] > dateadd(year, -1, GetDate())
以下代码会对您有所帮助。我使用 DATEPART 获取周数。
select *,case when previousweekmax<>0 then thisweekmax-previousweekmax else 0 end as DIFF
from
(
select week,object,val as thisweekmax,
case when week >1 then (select max(value) from test where DATEPART ( ww , date )=week-1)
else 0 end as previousweekmax
from
(
select distinct DATEPART ( ww , date )as week,object,max(value) as val from test
group by DATEPART ( ww , date ),object
)tmp
)t
输出
week object thisweekmax previousweekmax DIFF
1 Mileage 12500 0 0
2 Mileage 13200 12500 700
3 Mileage 13700 13200 500