Может ли ежедневный фильтр частоты клиента быть уменьшен до менее чем 2 подзапросов, если для данного дня и клиента существует несколько временных меток? - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь выяснить, есть ли более эффективный способ подсчета постоянных клиентов.Сложность состоит в том, что я хочу фильтровать клиентов на основе платежей в день, удаляя при этом вторичные записи, которые происходят для данного клиента более чем за один день.Набор данных включает записи для клиентов в тот же день, но в разное время.Я хочу только посчитать 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

Данные и запросы на скрипте SQL

1 Ответ

0 голосов
/ 03 июня 2018

Это не может быть более эффективным, но оно короче:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...