Последнее значение каждого месяца года + последнее значение перед годом - PullRequest
0 голосов
/ 30 октября 2019

Я работаю на 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...