Получить Макс из двух суммированных строк на одной отметке времени - PullRequest
0 голосов
/ 29 января 2019

Итак, у меня есть определенные счетчики с индивидуальными идентификаторами.Эти счетчики регистрируют объемы ежечасно.Некоторые счетчики будут связаны между собой, и их идентификаторы будут иметь разницу в 1 цифру, т. Е. (1999990 и 1999991).Мне нужно найти час, в который сумма этих двух метров будет самой большой.

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

            SAMPLE DATA

   Meter     Hourly Volume  TimeStamp
   --------|---------------|-------------------
   1999990       25          02-21-2017 10:00am
   1999991       19          02-21-2017 10:00am
   1999990       20          02-21-2017 3:00pm
   1999991       16          02-21-2017 3:00pm      

Итак, вот примерданные, чтобы лучше уточнить предполагаемые результаты.Для счетчиков, которые отключены на одну цифру, необходимо добавить громкость в один и тот же час.Таким образом, в 10:00 мы добавили бы 25 + 19 = 44. Затем мы добавили бы 15:00 20 + 16 = 36. Таким образом, из этих двух мы хотели бы выбрать запись 10:00, потому что она самая большая.из данных.

SELECT B.METER_NAME, 
to_char(B.effectiveDate, 'mm/dd/yyyy hh24:mi:ss'),
MAX(B.summedVOLUME)

from

    (SELECT  
     A.METER_NAME,
     to_char(A.EFFECTIVE_DATE, 'mm/dd/yyyy hh24:mi:ss') as effectiveDate, 
     SUM(A.ADJUSTED_TOTAL_VOLUME) AS summedVolume

     FROM 

         (SELECT METER_NUMBER, METER_NAME, HOURLY.EFFECTIVE_DATE, 
          HOURLY.ADJUSTED_TOTAL_VOLUME, ROW_NUMBER() OVER (PARTITION BY 
          METER_NUMBER ORDER BY ADJUSTED_TOTAL_VOLUME DESC) rank
          FROM METER, HOURLY, METER_CHARACTERISTIC


          WHERE METER.METER_NUMBER_INDEX = HOURLY.METER_NUMBER_INDEX
          AND METER.METER_NUMBER_INDEX = 
          METER_CHARACTERISTIC.METER_NUMBER_INDEX
          AND HOURLY.METER_NUMBER_INDEX = 
          METER_CHARACTERISTIC.METER_NUMBER_INDEX

          METER_STATUS = 'A'
          AND METER.METER_NUMBER LIKE 
          ('%' || (SUBSTR(meter.meter_number, 0,6)) || '%' )

          AND ADJUSTED_TOTAL_VOLUME IS NOT NULL
          AND MEASUREMENT_MONTH = '201702'
        )A      

    WHERE A.rank = 1 
    group by A.METER_NAME, A.EFFECTIVE_DATE ) B  
group by B.METER_NAME, B.effectiveDate
;

Я рассчитываю получить максимум обоих метров за определенный час.Однако теперь я получаю «Недопустимый номер ORA-01722», как только я добавлю самый внешний запрос.

РЕДАКТИРОВАТЬ: пропустить кусок кода, который может вызвать проблемы.Функция substr для идентификации meter_number может быть причиной его возникновения.

1 Ответ

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

Глядя только на то, почему вы получаете эту ошибку, а не на общую задачу, которую вы пытаетесь выполнить, она генерируется, потому что ваш внешний запрос выполняет:

SELECT B.METER_NAME, 
to_char(B.effectiveDate, 'mm/dd/yyyy hh24:mi:ss'),

, но встроенное представлениеB выполняет:

SELECT  
     A.METER_NAME,
     to_char(A.EFFECTIVE_DATE, 'mm/dd/yyyy hh24:mi:ss') as effectiveDate, 

, что означает, что B.effectiveDate уже является строкой .Если базовое значение даты, скажем, 2019-01-30 01:23:34, то внешний запрос пытается выполнить:

to_char('01/30/2019 01:23:34', 'mm/dd/yyyy hh24:mi:ss')

, и при передаче строки в нем по умолчанию используется значение числовая версия этой функции (вы знаете, что она представляет дату, а Oracle - нет, поэтому ему нужно угадать, какую версию использовать) и пытается неявно преобразовать первый аргумент в число, так как это то, чтофункция ожидает;так что на самом деле он пытается сделать:

to_char(to_number('01/30/2019 01:23:34'), 'mm/dd/yyyy hh24:mi:ss')

и это неявное to_number('01/30/2019 01:23:34'), которое вызывает ошибку ORA-01722.

Вам необходимо удалить одно из преобразований;либо:

SELECT B.METER_NAME, 
B.effectiveDate,
MAX(B.summedVOLUME)

from

    (SELECT  
     A.METER_NAME,
     to_char(A.EFFECTIVE_DATE, 'mm/dd/yyyy hh24:mi:ss') as effectiveDate, 

или предпочтительно (поэтому значение даты преобразуется в строку в последний возможный момент):

SELECT B.METER_NAME, 
to_char(B.effectiveDate, 'mm/dd/yyyy hh24:mi:ss'),
MAX(B.summedVOLUME)

from

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