在同一时间戳记上获得最多两行的总和

时间:2019-01-29 19:21:34

标签: sql oracle

因此,我有一些带有各自ID的仪表。这些仪表每小时记录一次体积。某些仪表将链接在一起,它们的ID将相差1位,即(1999990和1999991)。我需要找到两米总和最大的小时。

我尝试做一个Max函数,但是我很简短,得到了两个结果,而不仅仅是一个。我尝试使用对分区尝试的排名,但收到了类似的结果。我下面的查询是最接近的查询,我想我可以对它们进行求和并找到最大值,但是现在我收到了无效的数字错误。

            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 am,我们将加起来25 + 19 =44。然后我们将在3:00 pm处加起来20 + 16 =36。因此,在这两个记录中,我们想选择10:00 am记录,因为它是最大的记录从数据。

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无效号码”。

编辑:遗漏了一段可能引起问题的代码。用于标识meter_number的substr函数可能是导致该问题的原因。

1 个答案:

答案 0 :(得分:0)

仅查看为什么会出现该错误,而不是要尝试执行的总体任务,是因为外部查询正在执行而将其抛出:

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')

,当您在其中传递字符串时,默认值为the numeric version of that function(您知道它代表一个日期,但是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,