如何为此新格式更改此Oracle SQL

时间:2014-11-27 02:19:07

标签: sql oracle oracle-sqldeveloper

我是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

所以这是我需要的输出

enter image description here

我现在拥有的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" /" 和下载是文件夹中匹配文件名的计数..所以谁可以帮助我,让这个工作

2 个答案:

答案 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;

SQL Fiddle