sql - 当给定日期和客户存在多个时间戳时,是否可以将每日客户频率过滤器减少到少于 2 个子查询?

标签 sql postgresql postgresql-9.6

我想弄清楚是否有更有效的方法来计算常客的数量。棘手的部分是我想根据每天的付款过滤客户,同时删除给定客户超过一天的次要记录。该数据集包括同一天不同时间的客户记录。我只想计算 1 次,而且每天只有 1 次付款。 例如,给定以下值(payment_id、customer_id、payment_date),我想要计数 2

(17504, 341, '2007-02-16 17:23:14'),
(17505, 341, '2007-02-16 22:41:45'),
(17506, 341, '2007-02-19 19:39:56')

记录按客户和日期分组后,我想过滤记录超过 3 条的客户,并返回计数。

我当前的查询如下。如果没有那么多嵌套子查询,还有另一种方法可以做到这一点吗?

SELECT (COUNT(*)) AS count_for_customers_with_more_than_3_visits
FROM (
  SELECT customer_id
  FROM (
    SELECT customer_id, date_trunc('day', payment_date) AS day
    FROM payments
    GROUP BY customer_id, day
  ) visits_by_day
  GROUP BY customer_id
  HAVING COUNT(day) > 3
) sub;

我正在使用 Postgres v9.6

Data and query on SQL fiddle

最佳答案

这可能不是更高效,但它更短:

SELECT COUNT(*)) AS count_for_customers_with_more_than_3_visits
FROM (SELECT customer_id
      FROM payments
      GROUP BY customer_id
      HAVING COUNT(DISTINCT date_trunc('day', payment_date)) > 3
     ) sub;

关于sql - 当给定日期和客户存在多个时间戳时,是否可以将每日客户频率过滤器减少到少于 2 个子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50670372/

相关文章:

sql - 如何改进此邮寄地址 SQL Server SELECT 语句?

sql - postgresql 中的长更新

mysql - 如何使用sql查询将同一字段分组在一个字段下

python - Docker角色创建错误-角色___不存在

java - 在 Java 中从 PostgreSQL 检索 xml 数组

postgresql - 使用 LIMIT..OFFSET 时使用奇怪的 PostgreSQL 索引

PostgreSQL 数据类型 jsonb 最大存储范围

MySQL 分组和排序

NLog,Npgsql.PostgresException : '42804: column "DateTime"is of type timestamp without time zone but expression is of type text

sql - 在 Postgres 的数组字段上应用聚合函数?