SQL组所有具有不同后缀的类似项

时间:2017-03-01 10:55:24

标签: mysql sql

我有一个表将所有HTTP请求记录到我的服务器,目的是不时地知道某个API是否花费太长时间,并修复它。

示例:

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/1 item/2item/3

如何分组,以便它会删除/之后的最后一个数字?

修改

我希望这只能从最后删除数字,而不是字符串

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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