PostgreSQL将多行折叠为一个自定义命名

时间:2016-05-03 11:19:54

标签: postgresql

我正试图在PostgreSQL中折叠多行。 我在上个月计算了网络应用程序中特定页面的“页面浏览量”。

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/342fer243r
/title/1rf3f134r4
/title/141f14r1tr

我想最终:

/title/subtitle

我不确定如何完善我的查询以使用

折叠所有行
/title/*

只有一个自定义的命名行。

**更新**

我在想这样的事情:

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/(*)',。有什么好主意吗?

1 个答案:

答案 0 :(得分:0)

您可以做的一件事是拥有一个映射表,将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映射前缀' / title /',' / home /'等,以及我们将在结果中显示的页面名称。

它进行简单的字符串比较以检查url是否与前缀匹配,如果是,则使用该名称而不是url。

这确实会产生副作用,即任何不符合任何模式的网址都不会出现。

小提琴:http://sqlfiddle.com/#!15/d6279/3