2016-05-03 8 views
0

私はPostgreSQLで複数の行を折りたたみようとしています。 先月、ウェブアプリケーションの特定のページの「ページビュー」を計算しています。PostgreSQLは複数の行を1つのカスタムとして縮約します

/title/342fer243r 
/title/1rf3f134r4 
/title/141f14r1tr 

そして私はで終わるしたいと思います:

SELECT DISTINCT page_urlpath AS "URL", 
COUNT(DISTINCT (domain_userid)) AS "Unique views" 
FROM "atomic".events 
WHERE derived_tstamp > current_date - integer '31' 
GROUP BY 1 
ORDER BY 2 DESC 

出力は次のようになります

/title/subtitle 

私はすべての行を折りたたむには、私のクエリを完璧に方法がわかりませんよ

/title/* 

とjus 1つのカスタム名前付き行。

** UPDATE **

私はのようなものを考えていた:

SELECT DISTINCT Regexp_replace(page_urlpath, 'title/(*)', 'title/subtitle') AS "URL", 
       Count(DISTINCT (domain_userid))      AS "Unique views" 
FROM   "atomic".events 
WHERE   derived_tstamp > CURRENT_DATE - integer '31' 
GROUP BY  1 
ORDER BY  2 DESC ; 

しかし、私は "すべて" の部分が動作しないことを知っています。 'title/(*)',。良いアイデア?

+0

**常に**の最初の要素を取りたいですか?また、 'current_date - 整数' 31 'は 'current_date - 31'に簡略化することができます –

+0

私はすべての' 4h23u5hi4 'をもっと意味のあるものに崩壊して名前を変更したいと思います。 URLの最初の要素は実際には必要ありません。 – s0ren

+0

私の質問に言い換えることができます:関連する部分**のみです**最初の部分、または一部のURLでは最初の部分、他の部分では最初と2番目の部分、もう1つは2番目と3番目の部分です。 URL? –

答えて

0

あなたが行うことができることの1つは、レポートするページにURLパターンをマップするマッピングテーブルがあることです。実際のデータベーステーブルを作成したくない場合は、CTEにすることができます。例えば

:ここ

CREATE TABLE events (
page_url varchar, 
derived_tstamp timestamp, 
domain_userid int); 

insert into events values 
('/title/item1',current_timestamp,1), 
('/title/item1',current_timestamp,2), 
('/title/item2',current_timestamp,3), 
('/title/item3',current_timestamp,1), 
('/home/user1',current_timestamp,1), 
('/home/user2',current_timestamp,2), 
('/home/user3',current_timestamp,3), 
('/order/order1',current_timestamp,1), 
('/order/order2',current_timestamp,1); 


WITH pages (prefix,page) AS (
VALUES ('/title/','/title/subtitle'), 
     ('/home/','Home Page'), 
     ('/order/','/order/*') 
) 
SELECT 
    pages.page as "Page", 
    count(distinct (domain_userid)) as "Unique Views" 
FROM 
    events e 
    INNER JOIN pages ON LEFT(page_url, LENGTH(pages.prefix)) = pages.prefix 
WHERE 
    derived_tstamp > current_date - 31 
GROUP BY pages.page 
ORDER BY 2 DESC 

CTEは、我々は結果に表示しようとしているページ名に、接頭辞「/タイトル/」、「/ホーム/」などをマップページ。

urlが接頭辞と一致するかどうかを確認する単純な文字列の比較を行い、そうであればurlの代わりにその名前を使用します。

これは、パターンに一致しないURLは表示されないという副作用があります。

フィデリティ:http://sqlfiddle.com/#!15/d6279/3

+0

実際には私にとってはうまくいかないようです:( – s0ren

+0

私が使用しているテーブルの定義。フィドルが現れているので、そこに作成できません。クエリに原子ネームスペースが削除されているので、デフォルトスキーマのイベントテーブルに対して実行されます。 – Gary

+0

私は、 – Gary

関連する問題