2016-11-21 22 views
1

我在postgres數據庫中有一列記錄我們網站上的頁面的搜索querystrings。如何統計postgres中一組querystrings的整數頻率

列包含像

"a=2&b=4" 
"a=2,3" 
"b=4&a=3" 
"a=4&a=3" 

我想找出每個值的頻率爲一定的參數(a)中的數據。

value | freq 
------|------ 
3  | 3 
2  | 2 
4  | 1 

無論如何在單個SQL語句中執行此操作?

回答

3

事情是這樣的:

with all_values as (
    select string_to_array(split_part(parameter, '=', 2), ',') as query_params 
    from the_table d, 
     unnest(string_to_array(d.querystring, '&')) as x(parameter) 
    where x.parameter like 'a%' 
) 
select t.value, count(*) 
from all_values av, unnest(av.query_params) as t(value) 
group by t.value 
order by t.value; 

在線例如:http://rextester.com/OXM67442

0

嘗試這樣的事:

select data_value,count(*) from (
    select data_name,unnest(string_to_array(data_values,',')) data_value from (
    select split_part(data_array,'=',1) data_name ,split_part(data_array,'=',2) data_values from (
      select unnest(string_to_array(mydata,'&')) data_array from mytable 
     ) a 
     ) b 
    ) c where data_name='a' group by 1 order by 1 
0

假設保持計數THA表稱爲paramcount

WITH vals(v) AS 
    (SELECT regexp_replace(p, '^.*=', '') 
    FROM regexp_split_to_table(
      'b=4&a=3,2', 
      '&|,' 
     ) p(p) 
    ) 
INSERT INTO paramcount (value, freq) 
    SELECT v, 1 FROM vals 
ON CONFLICT (value) 
    DO UPDATE SET freq = paramcount.freq + 1 
     WHERE paramcount.value = EXCLUDED.value; 
0
  1. GET CSV整數後 '一個='
  2. 拆分爲數字
  3. 統計值

    select v, count(*) from (
        SELECT c,unnest(string_to_array(unnest(regexp_matches(c,'a=([0-9,]+)','g')),',')) as v FROM qrs 
    ) x group by v; 
    

參數多態:

WITH argname(aname) as (values ('a'::TEXT)) 
select v, count(*) from (SELECT c,unnest(string_to_array(unnest(regexp_matches(c,aname||'=([0-9,]+)','g')),',')) as v FROM qrs,argname) x group by v;