概述
在本报告中,我们将探讨一个使用 FILTER 函数根据用户活动摘要偏好对用户数据进行分段的 SQL 查询。FILTER 函数是 SQL 中一个强大的工具,它允许在单个查询中进行条件聚合,提供了一种将 COUNT()、SUM()、AVG() 等聚合函数应用于数据子集的方法。
SQL 查询详解
提供的 SQL 查询计算具有不同活动摘要设置的用户数量。以下是查询各部分的细分:
SELECT
COUNT(*) FILTER (WHERE uo.email_digests = false) AS "Disabled",
COUNT(*) FILTER (WHERE uo.email_digests = true) AS "Total Enabled",
COUNT(*) FILTER (WHERE uo.email_digests = true AND u.last_seen_at > CURRENT_DATE - INTERVAL '180 DAYS') AS "Skipped",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 30) AS "Half Hourly",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 60 ) AS "Hourly",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 1440) AS "Daily",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 10080) AS "Weekly",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 43200) AS "Monthly",
COUNT(*) FILTER (WHERE uo.email_digests = true AND uo.digest_after_minutes = 259200) AS "6 Monthly"
FROM user_options uo
JOIN users u ON u.id = uo.user_id
WHERE uo.user_id > 0
COUNT(*) FILTER (WHERE condition)计算符合指定条件的行数。AS子句重命名输出列,以提高可读性。- 该查询将
user_options表与users表连接起来,以访问用户设置和活动数据。 WHERE uo.user_id > 0条件用于筛选掉任何系统用户或非标准条目。
FILTER 函数的工作原理
FILTER 函数与聚合函数结合使用,仅计算满足特定标准的行。它是条件聚合的更具可读性且通常更有效的替代方案,优于子查询或 CASE 语句。
以下是使用 FILTER 的一般语法:
AGGREGATE_FUNCTION(column_name) FILTER (WHERE condition) AS alias_name
何时使用 FILTER 函数
当您需要在单个查询中对具有不同条件的多个计数(或其他聚合)执行操作时,FILTER 函数特别有用。它简化了查询,避免了对多个子查询或复杂 CASE 语句的需求。
您可以使用 FILTER 函数来细分用户偏好、按反应对帖子进行分段或按类别对主题进行分段,等等。它是一个多功能工具,可以增强数据报告和分析。
结论
FILTER 函数是任何 SQL 工具包的宝贵补充。它允许进行清晰简洁的条件聚合,使复杂的数据查询更易于管理和理解。