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