因此,我有一些带有各自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函数可能是导致该问题的原因。
答案 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,