Как получить максимальное или минимальное значение из запроса SELECT - PullRequest
1 голос
/ 11 апреля 2019

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

Мне удалось вытащить последние две записи для конкретного account_number и попытаться использовать MAX или MIN в запросе выбора, но, похоже, он работает только со столбцами

Это код, который у меня есть

 SELECT (MAX(SELECT actual_reading FROM test_meter_readings
                        WHERE account_number = '23-456789T67'
                        ORDER BY timestamp_capture 
                        DESC
                        LIMIT 2)) - 
                    (MIN(SELECT actual_reading FROM test_meter_readings
                        WHERE account_number = '23-456789T67'
                        ORDER BY timestamp_capture 
                        DESC
                        LIMIT 2))
                      ''',)

Я ожидаю получить разницу от 2 последних записей для каждой учетной записи в таблице

1 Ответ

0 голосов
/ 11 апреля 2019

Использование LAG():

select (actual_reading - prev_actual_reading) as diff
from (select tmr.*,
             lag(actual_reading) over (partition by account_number order by timestamp_capture) as prev_actual_reading
      from test_meter_readings tmr
      where account_number = '23-456789T67'
     ) tmr
order by timestamp_capture desc
fetch first 1 row only;  -- or limit 1

РЕДАКТИРОВАТЬ:

Для обработки нескольких учетных записей, вы можете использовать row_number() или distinct on.Первый метод выглядит так:

select (actual_reading - prev_actual_reading) as diff
from (select tmr.*,
             lag(actual_reading) over (partition by account_number order by timestamp_capture) as prev_actual_reading,
             row_number() over (partition by account_number order by timestamp_capture) as seqnum
      from test_meter_readings tmr
      -- where account_number = '23-456789T67'
     ) tmr
where seqnum = 1;
...