我有一个简单的代码来显示基于时间戳的最新错误消息:
SELECT
line_item || ': ' || error_msg as RejectionMsg
FROM reqs
WHERE reqs_number = 'XXXXXXX'
and rqj_timestamp = (select max(rqj_timestamp) from reqs
WHERE reqs_number = 'XXXXXX' )
我的数据类似于:
rqj_timestamp line_item Error_msg
08-MAY-2009 14:00:04 8928 INVALID (RC4C) E
08-MAY-2009 14:00:04 8929 INVALID (R4CO) EY0
05-AUG-2013 00:13:42 11760 OO_USR_1 - NO_DATA_FOUND:No Data found for REQUEST
05-AUG-2013 00:13:42 11761 OO_USR_1 - NO_DATA_FOUND:No Data found for REQUEST
05-AUG-2013 00:13:42 11762 OO_USR_1 - NO_DATA_FOUND:No Data found for REQUEST
05-AUG-2013 00:14:59 11763 OO_USR_1 - NO_DATA_FOUND:No Data found for REQUEST
06-AUG-2013 06:55:59 11807 OO_45_ERROR_REGION_DERIV
06-AUG-2013 06:55:59 11808 OO_45_ERROR_REGION_DERIV
06-AUG-2013 06:55:59 11809 OO_45_ERROR_REGION_DERIV
我的查询是给我输出08-MAY-2009 14:00:04时间戳而不是06-AUG-2013 06:55:59时间戳。
3: INVALID (RC4C) E
3: INVALID (R4CO) EY0
知道我在哪里错了吗?或者我如何改进我的查询..如果我删除08-MAY-2009 14:00:04行,它的工作原理非常好。
提前感谢您的帮助。
答案 0 :(得分:0)
我认为你的时间戳不是日期或类似的数据类型,而是像nvarchar2这样的字符数据类型。将表格更改为正确的数据类型。
一个工作但不太干净的解决方案是使用像
这样的东西cast((select max(cast(rqj_timestamp as date)) from reqs) as nvarchar2)
可能取决于国家语言设置等。
您可以使用列在外部cast
中的字符数据类型。
答案 1 :(得分:0)
尝试类似(未经测试)的内容:
select *
from (
select r.*,
row_number() over (partition by reqs_number order by rqj_timestamp desc nulls last) rnum
from reqs r
where reqs_number = 'XXXXXXX'
)
where rnum = 1;
此外,假设“rqj_timestamp”实际上是一个时间戳(或至少是一个日期)。
答案 2 :(得分:0)
感谢您指出检查数据类型..发现它是varchar,添加了to_date(rqj_timestamp,'DD-MON-YYYY HH24:MI:SS')
。