
在许多业务场景中,一个客户可能在系统中存在多条记录,但根据业务规则,通常只有一个记录应该被标记为“活跃”。本节的目标是识别那些在客户表中仅有一条记录,并且该记录被标记为活跃的客户。
假设我们有一个Customers表,包含customer_number(客户编号)、customer_name(客户名称)、active(活跃标志,布尔值)等字段。理想情况下,对于同一个customer_number,应该只有一条记录且active为TRUE。我们需要找到那些完全符合这一条件的客户。
PostgreSQL的FILTER子句在COUNT等聚合函数中提供了强大的条件聚合能力。我们可以利用它来同时检查记录总数和活跃记录数。
SELECT customer_number FROM Customers c GROUP BY customer_number HAVING COUNT(*) = 1 AND COUNT(*) FILTER (WHERE active) = 1;
代码解析:
这种方法比尝试先过滤再计数的传统方式更简洁和高效,因为它在一个GROUP BY操作中完成了所有必要的检查。
第二个常见需求是识别那些在系统中没有任何活跃记录,并且在过去指定天数内(例如180天)没有下达任何订单的客户。这对于清理数据、识别潜在流失客户或进行特定营销活动至关重要。
除了Customers表,我们还有一个order_master表,包含customer_number、deliverydate(交货日期)、order_number(订单编号)、insert_time(订单插入时间)等字段。我们需要结合这两个表的信息:
我们可以通过嵌套查询和日期函数来解决这个问题。
SELECT cu.customer_number
FROM order_master om
JOIN (
SELECT customer_number
FROM Customers c
GROUP BY customer_number
HAVING COUNT(*) FILTER (WHERE active) = 0
) AS cu ON om.customer_number = cu.customer_number
GROUP BY cu.customer_number
HAVING MAX(om.insert_time) < CURRENT_DATE - INTERVAL '180 day';代码解析:
SELECT customer_number FROM Customers c GROUP BY customer_number HAVING COUNT(*) FILTER (WHERE active) = 0
这个子查询的作用是识别那些在Customers表中没有任何活跃记录的客户。COUNT(*) FILTER (WHERE active) = 0精确地筛选出所有记录的active字段都为FALSE的客户编号。
如果不仅需要客户编号,还需要获取这些非活跃客户的详细订单信息,可以使用公共表表达式(CTE)来提高查询的可读性和模块化。
WITH inactive_cust AS (
SELECT cu.customer_number
FROM order_master om
JOIN (
SELECT customer_number
FROM Customers c
GROUP BY customer_number
HAVING COUNT(*) FILTER (WHERE active) = 0
) AS cu ON om.customer_number = cu.customer_number
GROUP BY cu.customer_number
HAVING MAX(om.insert_time) < CURRENT_DATE - INTERVAL '180 day'
)
SELECT c.customer_number, c.customer_name,
o.order_number, o.insert_time
FROM inactive_cust ic
JOIN Customers c ON ic.customer_number = c.customer_number
JOIN order_master o ON ic.customer_number = o.customer_number;代码解析:
通过掌握这些PostgreSQL高级查询技巧,开发者和数据分析师能够更精准、高效地从复杂数据中提取有价值的信息,支持业务决策。
以上就是PostgreSQL高级查询:精确识别客户活跃状态与订单历史的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号