我正试图在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/(*)',
。有什么好主意吗?
答案 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。
这确实会产生副作用,即任何不符合任何模式的网址都不会出现。