很抱歉,如果这是一个显而易见的问题。我对SQL很陌生,无法根据我的需要调整其他示例。
我有一张表(Postgres 9.3)定义为:
CREATE TABLE scripts (
id SERIAL PRIMARY KEY,
name VARCHAR(256) NOT NULL,
content TEXT NOT NULL);
内容列包含各种脚本的内容。我有兴趣计算在这些脚本中发生不同函数调用的次数。
我设法构建了一个运行正则表达式内容的查询,并取出所有函数调用(作为funcs)
SELECT id, name, regexp_matches(LOWER(content), '(\w+\.\w+)\(', 'g') AS funcs
FROM scripts
GROUP BY id, name, funcs;
输出类似于
1, myscript, {class.m1}<br>
2, otherscript, {class_b.method4}<br>
2, otherscript, {class.m1}<br>
3, last_script, {classname.method2}<br>
3, last_script, {class.m1}<br>
3, last_script, {class_b.method4}<br>
我真的想把它变成一个表格,显示每个不同功能的计数。像
这样的东西class.m1, 3
class_b.method4, 2
classname.method2, 1
这是我到目前为止所做的:
SELECT COUNT(DISTINCT funcs) FROM (
SELECT tsr_id, name, regexp_matches(LOWER(content), '(\w+\.\w+)\(', 'g') AS funcs
FROM tsr_conf.rules
GROUP BY tsr_id, name, funcs
) x
但不幸的是,它只是给了我不同功能的总数。关于如何计算每个不同功能的出现的任何建议都将非常受欢迎!
答案 0 :(得分:2)
鉴于您的第一个查询返回的内容,group by
应该执行您想要的操作:
SELECT funcs, COUNT(*)
FROM (SELECT tsr_id, name, regexp_matches(LOWER(content), '(\w+\.\w+)\(', 'g') AS funcs
FROM tsr_conf.rules
GROUP BY tsr_id, name, funcs
) x
GROUP BY funcs;
你实际上可以更简单地写这个:
SELECT regexp_matches(LOWER(content), '(\w+\.\w+)\(', 'g') AS funcs, COUNT(DISTINCT tsr_id, name)
FROM tsr_conf.rules
GROUP BY funcs;