SQL Oracle,选择删除文本和格式日期

时间:2018-09-28 19:26:28

标签: sql oracle

我有2列:

   Name         Date
name1@group     43328                 
name1@group     43329                 
name2@group     43330
name2@group     43331                 
name3@group     43332                 
name3@group     43333

这是最终结果,即“名称”列中的名称(不带@group)和“日期”列中的最大编号

Name        Date
name1       43329                 
name2       43331                 
name3       43333

但是,数据格式(日期列)的最大值:

Name        Date
name1       17-Aug-2018                 
name2       19-Aug-2018                 
name3       21-Aug-2018

谢谢!

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用instr()substr()提取不包含组的名称。

SELECT substr("name", 1, instr("name", '@') - 1) "name",
       to_date('1900-01-01', 'YYYY-MM-DD') + max("date") - 1 "date"
       FROM elbat
       GROUP BY substr("name", 1, instr("name", '@') - 1);

另一种方法是使用regexp_substr()

SELECT regex_substr("name", '^[^@]+') "name",
       to_date('1900-01-01', 'YYYY-MM-DD') + max("date") - 1 "date"
       FROM elbat
       GROUP BY regex_substr("name", '^[^@]+');

它的优点是,它使用整个字符串作为名称,与第一个产生空字符串(即Oracle中的'@')相比,它不应该包含任何NULL在这种情况下。但是,正则表达式可能会占用更多资源。您还可以尝试检查'@'的出现,如果其中包含substr(),则仅在名称上应用'@'


编辑:

如果这些数字来自Excel,则必须减去一日,例如Excel falsely treats 1900 as a leap year

答案 1 :(得分:0)

regexp_substr()是提取电子邮件的一种简单方法。日期算术非常简单。所以:

select regexp_substr(email, '[^@]+', 1, 1) as email, max(date '1900-01-01' + dte - 1)
from t
group by regexp_substr(email, '[^@]+', 1, 1) ;

Here是一个学期。