SQL Разница между МАКС (с этой недели) и МАКС (с прошлой недели) - PullRequest
0 голосов
/ 30 января 2020

В таблице у меня есть пробег в день. Теперь я хочу запрос, который дает мне мили в неделю. Поэтому я подумал, что я беру значение MAX с этой недели и значение MAX с прошлой недели, и разница - это мой ответ. Но как я могу сделать это в запросе?

Моя таблица выглядит так:

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 et c.

Я ожидаю такой результат:

ThisWeek        Object       ThisWeekMax     LastWeekMax       Difference
2020_02         Mileage      13200           12500             700
2020_03         Mileage      13700           13200             500

Ответы [ 3 ]

0 голосов
/ 30 января 2020

Я предполагаю, что у вас есть уникальный идентификатор в этой таблице, потому что он понадобится вам для присоединения.

 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())
0 голосов
/ 30 января 2020

Следующий код поможет вам. Я использовал 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
0 голосов
/ 30 января 2020

Использование 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
...