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

Can a daily customer frequency filter be reduced to less than 2 subqueries when multiple timestamps exist for a given day and customer?

我想弄清楚是否有更有效的方法来计算常客的数量。棘手的部分是我想根据每天的付款过滤客户,同时删除给定客户超过一天的次要记录。该数据集包括同一天不同时间的客户记录。我只想计算 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 个的客户,我想 return 计数。

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

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;