从正则表达式匹配生成直方图

时间:2015-01-14 11:26:34

标签: sql postgresql

很抱歉,如果这是一个显而易见的问题。我对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

但不幸的是,它只是给了我不同功能的总数。关于如何计算每个不同功能的出现的任何建议都将非常受欢迎!

1 个答案:

答案 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;