sql - 从 VARCHAR2 中提取最近的日期
问题描述
数据:
USER_ID VIOLATION_DATES
--------------------------------
1 18-Jul-21 > 24-Jul-21
2 05-Aug-21
3 09-Jun-21
1 18-Jul-21
我有一个表格,其中包含用户及其违规日期的列。我想为每个用户提取最近的违规行为。
这是我写的查询:
select
USR_ID,
max(to_date(VIOLATION_DATES, 'DD-MON-YY')) as Most_Recent_VIOLATIONS
from
table
group by
USR_ID
但是我收到此错误:
ORA-01830: 日期格式图片在转换整个输入字符串之前结束
我认为这与最近一次违规的附加方式有关(18-Jul-21 > 24-Jul-21 )。谁能提供有关如何为每个用户提取最近日期的任何说明?例如:
USER_ID VIOLATION_DATES
--------------------------
1 24-Jul-21
2 05-Aug-21
3 09-Jun-21
我知道这种存储方法并不理想,但这是我无法控制的。
解决方案
您可以将多值字符串拆分为单独的行,然后正常“分组”(该with
子句只是提供测试数据 - 替换您的实际表):
with demo (user_id, violation_dates) as
( select 1, '18-Jul-21 > 24-Jul-21' from dual union all
select 2, '05-Aug-21' from dual union all
select 3, '09-Jun-21' from dual union all
select 1, '18-Jul-21' from dual )
select user_id
, max(to_date(regexp_substr(d.violation_dates, '[^> ]+', 1, r.rn) default null on conversion error,'DD-MON-YY')) as violation_date
from demo d
cross apply
( select rownum as rn
from dual connect by rownum <= regexp_count(d.violation_dates,'>') +1 ) r
group by user_id
order by 1;
“转换错误时默认为空”需要 Oracle 12.2。
推荐阅读
- rabbitmq - Rabbitmq:无法从使用 FQDN 的节点加入集群到没有 FQDN 的节点
- java - 4G 左右的单行文件加载到 Spark
- c# - MongoDB 的 Hangfire 作业持久性
- node-ffi - 如何使用结构返回调用 dll 方法?
- android - 如何修复 SoundEffect qml 中的“E libOpenSLES:太多对象”
- java - .split("\") 不起作用,并且还有一个错误 arrayIndexOitOfBoundsException: 1
- terraform - 无法在 .tfvars 文件中复制“Terraform Up and Running”源的第 6 章示例
- android - 我正在尝试在 Android 上创建此搜索栏
- ms-access - MS Access 可以跨超过 2 个表处理多个多对多关系吗
- powershell - 获取AD组的成员并以特定方式输出