2015-01-14 33 views
0

對不起,如果這是一個明顯的問題。我對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 

但不幸的是它只是給我的不同功能的總數。任何關於如何計算每個不同功能的發生的建議將非常感謝!

回答

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; 
+0

嗨戈登。非常感謝您的回答!你給出的第一個查詢完美無缺。 再次感謝! – JBeFat