我有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
谢谢!
答案 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是一个学期。