2017-03-01 45 views
1

我有一個表將所有HTTP請求記錄到我的服務器,其目標是不時知道某些API是否需要太長時間並修復它。SQL組所有具有不同後綴的相似項目

例子:

uri    | rtime 
--------------------- 
item/1   | 0.1 
item/2   | 0.1 
item/3   | 0.1 
item/comments/1 | 0.2 

所以我做了這個查詢:

SELECT uri, COUNT(1) as count, AVG(rtime) as avgTime 
FROM access_log 
GROUP BY uri 
ORDER BY avgTime DESC 

的問題是,它不組例如item/1item/2item/3

我怎麼能集團這樣它會去掉/之後的最後一個數字?

編輯:

我想這從最終只帶數字,而不是字符串

+0

請問你總是有一些在字符串的結束?它也可以是多個字符數(10,666)? – HoneyBadger

+0

確實。總是數字,可以是任何數字(0 - > infi) – Amit

回答

1

一種選擇是使用MySQL的REGEXP運營商,以確定URI的斜線跟着一個數字的結束。在這種情況下,我們可以將uri的尾部分開,否則在聚合時使用完整的uri。

SELECT CASE WHEN uri REGEXP '^.*/[0-9]' 
       THEN SUBSTRING(uri, 1, INSTR(uri, '/')-1) 
       ELSE uri END AS uri, 
     COUNT(1) as count, 
     AVG(rtime) as avgTime 
FROM access_log 
GROUP BY CASE WHEN uri REGEXP '^.*/[0-9]' 
       THEN SUBSTRING(uri, 1, INSTR(uri, '/')-1) 
       ELSE uri END 
ORDER BY avgTime DESC 
+0

太強大了。也將在字符串上工作,例如'user/get'和'users/delete'將被分組 – Amit

+0

@Amit答案已更新。 –

+0

它的工作原理。對於一些'uri's,它可以做'item/undefined',但是沒關係,因爲它們仍然是分組的,我會知道如何閱讀它。 另外,請注意,相當於'CHARINDEX'的MySQL是'LOCATE' – Amit

0

使用SUBSTRING和CHARINDEX內置函數來獲得結果:

SELECT SUBSTRING(uri,LEN(uri),INSTR('/',uri)), COUNT(1) as count, 
    AVG(rtime) as avgTime 
    FROM #table 
    GROUP BY SUBSTRING(uri,LEN(uri),INSTR('/',uri)) 
    ORDER BY avgTime DESC 
+0

MySQL沒有CHARINDEX函數 –

相關問題