実現したいこと
サイトのアクセスログからURLのみを抽出し、最終的にURLごとの合計値を出力したいです。
集計の元になるViewを作成し、SQLを実行して出力しようと考えています。
困っているのはVIEWの作成です。
アクセスログが格納されているテーブル(ACCESS_LOG)にはアクセス先のコンテンツやファイル名を含んだURLが保持されていますが、コンテンツやファイル名は不要なので"/"で区切り、サイト一覧(SITE_ALL)から一致する値をURL_sinとして持たせたいです。
ACCESS_LOG
ID | URL | TIME |
---|---|---|
A123 | A123/sample/test.doc | 2024/12/1 12:00 |
A123 | A123/sample/test2.pdf | 2024/12/1 12:05 |
A123 | A123/sample/sub/test3.txt | 2024/12/1 12:10 |
B456 | B456/sample/test4.xlsx | 2024/12/1 12:30 |
B456 | B456/sample/sub/list/test5.png | 2024/12/1 12:45 |
B456 | B456/sample/sub/sub/doclib/test6.pdf | 2024/12/1 12:50 |
SITE_ALL
NAME | URL |
---|---|
サイトA1 | https://A123/sample |
サイトA2 | https://A123/sample/sub |
サイトB1 | https://B456/sample |
サイトB2 | https://B456/sample/sub |
サイトB3 | https://B456/sample/sub/sub |
作成したいView
最終的にSQLで出力したいデータ
URL | アクセス数 |
---|---|
https://A123/sample | 2 |
https://A123/sample/sub | 1 |
https://B456/sample | 1 |
https://B456/sample/sub | 1 |
https://B456/sample/sub/sub | 1 |
発生している問題・分からないこと
ACCESS_LOGとSITE_ALLでキーになる項目がないため、ACCESS_LOGの項目に「https://」を結合し、SUBSTRを使って“/”で抜き出し、この文字列(sub1~3)をキーとして使っています。
また、CASEを使ってsub3→2→1の順に比較してSITE_ALLに存在する値をURL_sinに表示します。
現在はLEFT JOINのON句でORを使っているのですが、ORだと必要のないデータまで表示されてしまい、実際の件数よりも多く表示されてしまいます。
CASEのように、sub3と一致するURL→なければsub2と一致するURL→なければsub1と一致するURLというふうに結合したいです。
また、文字列を結合して使っているのでコードの見栄えが悪く、他の記載方法はありますでしょうか?
作成したいView(一例)
ID | URL | sub1 | sub2 | sub3 | URL_sin | TIME |
---|---|---|---|---|---|---|
B456 | https://B456/sample/sub/sub/doclib/test6.pdf | https://B456/sample | https://B456/sample/sub | https://B456/sample/sub/sub | https://B456/sample/sub/sub | 2024/12/1 12:50 |
現在のView表示(一例)
↑本当は1行だけでいいのに、3行表示されてしまう
該当のソースコード
SQL
1CREATE OR REPLACE VIEW ACCESS_LOG_V 2AS 3SELECT AL.ID 4 ,AL.URL 5 ,'https://' || SUBSTR(AL.URL,1,INSTR(AL.URL,'/',1,1)-1) AS “sub1” 6 ,'https://' || SUBSTR(AL.URL,1,INSTR(AL.URL,'/',1,2)-1) AS “sub2” 7 ,'https://' || SUBSTR(AL.URL,1,INSTR(AL.URL,'/',1,3)-1) AS “sub3” 8 ,CASE 9 WHEN 'https://' || SUBSTR(AL.URL,1,INSTR(AL.URL,'/',1,3)-1) = SA.URL THEN SA.URL 10 WHEN 'https://' || SUBSTR(AL.URL,1,INSTR(AL.URL,'/',1,2)-1) = SA.URL THEN SA.URL 11 WHEN 'https://' || SUBSTR(AL.URL,1,INSTR(AL.URL,'/',1,1)-1) = SA.URL THEN SA.URL 12 ELSE 'no' 13 END AS “URL_sin“ 14 ,AL.TIME 15FROM ACCESS_LOG AL 16LEFT JOIN SITE_ALL SA 17ON 'https://' || SUBSTR(AL.URL,1,INSTR(AL.URL,'/',1,3)-1) = SA.URL 18OR 'https://' || SUBSTR(AL.URL,1,INSTR(AL.URL,'/',1,2)-1) = SA.URL 19OR 'https://' || SUBSTR(AL.URL,1,INSTR(AL.URL,'/',1,1)-1) = SA.URL
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
結合条件について調べましたが、ORとAND以外の使い方が見つけられませんでした。
ANDではURL_sinが“no”になってしまうので、今はORを使っています。
補足
ACCESS_LOGのデータがかなり多く、結合した際の負荷が少なくなるように作成したいです。
また、SITE_ALLにACCESS_LOGと共通するIDを追加することは可能です。自分で作成した際はIDの紐付けはうまくいかず追加していない状況です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/12/07 11:25 編集
2024/12/09 10:20
2024/12/09 13:12