使用 FILTER 汇总数据

概述

在本报告中,我们将探讨一个使用 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 工具包的宝贵补充。它允许进行清晰简洁的条件聚合,使复杂的数据查询更易于管理和理解。

4 个赞