отставание / опережение за предыдущий год, тот же месяц, дату, час на сервере sql - PullRequest
0 голосов
/ 16 января 2020

У меня есть год, месяц, день месяца, столбец часа и столбец продажи. Данные за четыре года. Как создать переменные задержки для продаж в следующем году, в том же месяце, в день месяца, час?

SELECT 
   [UtilityName],
   [CustomerID],
   [DT_EST],
   [Date_Raw],
   [Hour_Raw],
   [EPT_Year],
   [EPT_month],
   [EPT_DayNum],
   [EPT_Hour24],
   [Sales], 
   lag([Sales]) over( partition by [UtilityName] ,[CustomerID],[EPT_month],
   [EPT_DayNum],[EPT_Hour24]  order by [DT_EST] ) as lag_Sales
FROM [dbo].[table]

Ответы [ 2 ]

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

Вы должны также разделить по месяцам, дням и часам и упорядочить по годам по убыванию, чтобы получить значение предыдущего года:

lag([Sales]) 
  over(partition by 
          [UtilityName] ,[CustomerID],
          [EPT_month], [EPT_DayNum], [EPT_Hour24]
       order by [EPT_Year] 
  ) as lag_Sales
0 голосов
/ 16 января 2020

Я бы предложил вместо этого использовать left join:

SELECT t.*, tprev.Sales as prev_year_sales
FROM [dbo].[table] t LEFT JOIN
     [dbo].[table] tprev
     ON tprev.UtilityName = t.UtilityName AND
        tprev.CustomerId = t.CustomerId AND
        tprev.EPT_Year = t.EPT_Year - 1 AND
        tprev.EPT_month = t.EPT_month AND
        tprev.EPT_DayNum = t.EPT_DayNum AND
        tprev.EPT_Hour24 = t.EPT_Hour24;
...