我有一个表将所有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/2
和item/3
如何分组,以便它会删除/
之后的最后一个数字?
修改
我希望这只能从最后删除数字,而不是字符串
答案 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