Я работаю на SQL Server 2016. У меня есть таблица с 4 столбцами:
CREATE TABLE [dbo].[MeterReading](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[MachineID] [bigint] NOT NULL,
[Date] [date] NOT NULL,
[Hour] [real] NULL
Для каждого месяца данного года я хочу получить последнее значение (час) по MachineID. И я также хочу получить последнее значение перед началом года.
Вот результат, который мне нужен:
Month MachineID Hour
0 1 125.38
1 1 125.58
2 1 125.60
3 1 128.48
4 1 131.62
5 1 134.97
6 1 138.54
7 1 142.66
8 1 146.56
9 1 149.72
10 1 153.22
11 1 154.63
12 1 154.89
0 2 135.48
1 2 135.68
2 2 135.70
3 2 138.58
4 2 141.72
5 2 144.99
6 2 148.64
7 2 152.76
8 2 156.66
9 2 159.82
10 2 163.32
11 2 164.73
12 2 164.99
Месяц 0 - это последнее значение перед началом года.
Я попробовал это прямо сейчас, и это, кажется, работает, но ожидать, что это не очень быстро.
SELECT Month, MachineID, Max(Value) as Value
FROM (SELECT Month, MachineID, LAST_VALUE(Hour) OVER (PARTITION BY MachineID, Month ORDER BY MachineID, Date RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as Value
FROM (SELECT MeterReading.*, CASE WHEN YEAR(Date) < @Year THEN 0 ELSE MONTH(Date) END AS Month
FROM MeterReading
WHERE YEAR(MeterReading.Date) <= @Year) data) data
GROUP BY Month, MachineID