2016-11-21 1 views
1

私は私たちのウェブサイト上のページのクエリーストリングを記録するpostgresデータベースにカラムを持っています。postgresのクエリーストリングセット内の整数の頻度を数える方法

列は、私は、特定のパラメータ(a)は、各値の周波数をうまくしたい

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

ようなデータを含みます。

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

このような何かしてみてください:カウントを保持しますTHAテーブルがparamcountと呼ばれていると仮定すると、

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

を:

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. statに

    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; 
関連する問題