我是Oracle新手,我需要为新输出更改此SQL。
table name: access_log
col name: activity
来自字段的示例数据
Download file:/webdocs/data/3589/casemanagement/01/CR-CLOSE/01_31_30_9_1050073559.pdf
Download file:/webdocs/data/3589/casemanagement/01/CR-CLOSE/01_31_42_29_1070032338.pdf
Download file:/webdocs/data/3589/casemanagement/01/CR-CLOSE/01_31_47_16_1050909430.pdf
Download file:/webdocs/data/3423/casemanagement/01/debit_disputes/01_24_38_29_0001105562.pdf
Download file:/webdocs/data/3423/fraud/01/0130_FRAUD_CLAIM_OF_FRAUD_AND_FORGERY_RPT_3423.XLS
所以这是我需要的输出
我现在拥有的SQL如下,但我需要为新格式更改
select regexp_replace(activity, '^.*/(.*)/.*$', '\1') AS FILENAME,
COUNT (regexp_replace(activity, '^.*/(.*)/.*$', '\1')) AS DOWNLOADS
FROM sa.web_access_log where application_id = 5339 and time_stamp BETWEEN TO_DATE ('2014/02/01', 'yyyy/mm/dd') AND TO_DATE ('2014/02/02', 'yyyy/mm/dd')
GROUP BY regexp_replace(activity, '^.*/(.*)/.*$', '\1')
ORDER BY DOWNLOADS DESC;
所以文件名是从第二个到最后一个" /"第一个" /" 文件夹是从左边的第4个" /"到第5" /" 和下载是文件夹中匹配文件名的计数..所以谁可以帮助我,让这个工作
答案 0 :(得分:1)
尝试这个,结果根据您给出的数据和输出,结果是在所有必需字段出现在给定样本数据中的同一位置的情况下,列和表名是我的假设,您必须替换为原名: -
请查看以下示例的sqlfiddle link
select folder,filename,count(1) downloads
from
(
select substr(detail,instr(detail,'/',1,4)+1,instr(detail,'/',1,5)
-instr(detail,'/',1,4)-1) folder,
SUBSTR(DETAIL,INSTR(DETAIL,'/',-1,2)+1,INSTR(DETAIL,'/',-1,1)
-INSTR(DETAIL,'/',-1,2)-1) filename
from examd
)
group by folder,filename ;
以下是您需要的regexp_replace函数解决方案: -
select folder,filename,count(1) downloads
from
(
select regexp_replace(detail, '(.*?/){4}(.*)/.*$', '\2') folder,
regexp_replace(detail, '.*/(.*)/.*', '\1') as filename
from examd
)
group by folder,filename
order by folder,downloads desc;
你可以再试一次
select folder,filename,count(1) downloads
from
(
select regexp_replace(detail, '(.*?/){4}(.*)/.*$', '\2') folder,
regexp_replace(detail, '(.*{2}?/)(.*)/.*$', '\2') filename from examd
)
group by folder,filename
order by folder,downloads desc;
答案 1 :(得分:1)
如果您更喜欢正则表达式:
SELECT REGEXP_REPLACE(activity, '^(.*?/){4}(.*)/.*$', '\2') FROM access_log;