如何将行数计入 Postgres 搜索的 case 表达式的多个 'then'? (报告)
How can I count rows into more than one 'then' of a Postgres searched case expression? (reporting)
背景
我在 RDS 上有一个 Postgres 11 数据库 运行。我需要生成一份报告,显示特定时期内的事件计数,根据业务需求根据描述字符串对事件进行分组、重命名和计数。
问题
对于这类事情,我通常会使用搜索式 case 表达式,它运行良好 except:
部分规范要求 一些 事件必须计入多个类别。但是当评估 case 表达式时,它会将每一行计数 [或似乎计数] 到一个类别 [表达式中第一个匹配的]。
示例:
SELECT
CASE
WHEN (some_table.description ILIKE '%foo%' OR some_table.description ILIKE ‘%foobar%') THEN 'foo'
WHEN (some_table.description ILIKE '%bar%' OR some_table.description ILIKE ‘%foobar%) THEN 'bar'
END AS ‘category’,
count(*)
FROM some_table
GROUP BY category
ORDER BY category DESC
;
因此,给定
这样的数据
event_id | description
---------------------------------
1 | ‘string including foo’
2 | ‘foo also included in this string’
3 | ‘ this string includes bar’
4 | ‘this one says foobar’
预期输出如下:
some_table
category | count
---------------------------------
foo | 3
bar | 2
但是,实际输出返回为
some_table
category | count
---------------------------------
foo | 3
bar | 1
如何让描述包含“foobar”的记录同时计入“foo”和“bar”类别?如果案例表达式对于这个报告目标来说是错误的方法,那么应该使用什么?所有指导表示赞赏!
输出在第一个匹配处停止。如果两者都需要,请使用横向连接:
SELECT v.category, COUNT(*)
FROM some_table t CROSS JOIN LATERAL
(VALUES (CASE WHEN s.description ILIKE '%foo%' OR s.description ILIKE '%foobar%' THEN 'foo' END),
(CASE WHEN s.description ILIKE '%bar%' OR s.description ILIKE '%foobar% THEN 'bar' END)
) v(category)
WHERE v.category IS NOT NULL
GROUP BY v.category
ORDER BY v.category DESC
;
背景
我在 RDS 上有一个 Postgres 11 数据库 运行。我需要生成一份报告,显示特定时期内的事件计数,根据业务需求根据描述字符串对事件进行分组、重命名和计数。
问题 对于这类事情,我通常会使用搜索式 case 表达式,它运行良好 except: 部分规范要求 一些 事件必须计入多个类别。但是当评估 case 表达式时,它会将每一行计数 [或似乎计数] 到一个类别 [表达式中第一个匹配的]。
示例:
SELECT
CASE
WHEN (some_table.description ILIKE '%foo%' OR some_table.description ILIKE ‘%foobar%') THEN 'foo'
WHEN (some_table.description ILIKE '%bar%' OR some_table.description ILIKE ‘%foobar%) THEN 'bar'
END AS ‘category’,
count(*)
FROM some_table
GROUP BY category
ORDER BY category DESC
;
因此,给定
这样的数据
event_id | description
---------------------------------
1 | ‘string including foo’
2 | ‘foo also included in this string’
3 | ‘ this string includes bar’
4 | ‘this one says foobar’
预期输出如下:
some_table
category | count
---------------------------------
foo | 3
bar | 2
但是,实际输出返回为
some_table
category | count
---------------------------------
foo | 3
bar | 1
如何让描述包含“foobar”的记录同时计入“foo”和“bar”类别?如果案例表达式对于这个报告目标来说是错误的方法,那么应该使用什么?所有指导表示赞赏!
输出在第一个匹配处停止。如果两者都需要,请使用横向连接:
SELECT v.category, COUNT(*)
FROM some_table t CROSS JOIN LATERAL
(VALUES (CASE WHEN s.description ILIKE '%foo%' OR s.description ILIKE '%foobar%' THEN 'foo' END),
(CASE WHEN s.description ILIKE '%bar%' OR s.description ILIKE '%foobar% THEN 'bar' END)
) v(category)
WHERE v.category IS NOT NULL
GROUP BY v.category
ORDER BY v.category DESC
;