Подсчет уникальных комбинаций до даты - за месяц - PullRequest
0 голосов
/ 16 мая 2018

Я просматриваю таблицу с данными транзакций двухсторонней платформы, где есть покупатели и продавцы. Я хочу узнать общее количество уникальных комбинаций покупателей и продавцов. Допустим, Эйб покупает у Брэндона в январе, это 1 комбинация. Если Абэ покупает у Сиси в феврале, это дает 2, но если Абэ затем покупает у Брэндона снова, это все равно 2.

Мое решение было использовать функцию DENSE_RANK ():

WITH
combos AS (
  SELECT
        t.buyerid, t.sellerid,
        DENSE_RANK() OVER (ORDER BY t.buyerid, t.sellerid) AS combinations

    FROM transactions t

    WHERE t.transaction_date < '2018-05-01'
)
SELECT
    MAX(combinations) AS total_combinations

FROM combos

Это отлично работает. Каждая новая комбинация получает более высокий ранг, и если вы выбираете МАКСИМАЛЬНЫЙ результат, вы знаете количество уникальных комбинаций.

Тем не менее, я хочу знать это общее количество уникальных комбинаций в месяц. Проблема здесь в том, что если я группирую за месяц транзакции, он учитывает только уникальные комбинации в этом месяце. В примере с Abe это будет уникальная комбо в январе, а затем еще одна комбо в следующем месяце, потому что так работает группировка в SQL.

Пример:

transaction_date  buyerid  sellerid
2018-01-03        3828     219
2018-01-08        2831     123
2018-02-10        3828     219

Вывод именованных комбинаций DENSE_RANK () для всех этих строк:

transaction_date  buyerid  sellerid  combinations
2018-01-03        3828     219       1
2018-01-08        2831     123       2
2018-02-10        3828     219       2

И, следовательно, при выборе комбинаций MAX вы знаете количество уникальных комбинаций покупателя / продавца, которое находится здесь.

Однако я хотел бы видеть общее количество уникальных комбинаций вплоть до каждого начала месяца, за все месяцы до сих пор. Но когда мы группируемся по месяцам, это будет выглядеть так:

transaction_date  buyerid  sellerid  month combinations
2018-01-03        3828     219       jan   1
2018-01-08        2831     123       jan   2
2018-02-10        3828     219       feb   1

Хотя я на самом деле хотел бы вывод, как:

month  total_combinations_at_month_start
jan    0
feb    2
mar    2

Как мне решить это? Я пытался найти помощь по всем видам оконных функций, но безуспешно до сих пор. Спасибо!

1 Ответ

0 голосов
/ 16 мая 2018

Вот один из методов:

WITH combos AS (
      SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY sellerid, buyerid ORDER BY t.transaction_date) as combo_seqnum,
             ROW_NUMBER() OVER (PARTITION BY sellerid, buyerid, date_trunc('month', t.transaction_date) ORDER BY t.transaction_date) as combo_month_seqnum
      FROM transactions t

      WHERE t.transaction_date < '2018-05-01'
    )
SELECT 'Overall' as which, COUNT(*)
FROM combos
WHERE combo_seqnum = 1
UNION ALL
SELECT to_char(transaction_date, 'YYYY-MM'), COUNT(*)
FROM combos
WHERE combo_month_seqnum = 1
GROUP BY to_char(transaction_date, 'YYYY-MM');

Это помещает результаты в отдельные строки.Если вы хотите получить кумулятивное число и число в месяц:

SELECT to_char(transaction_date, 'YYYY-MM'),
       SUM( (combo_month_seqnum = 1)::int ) as uniques_in_month,
       SUM(SUM( (combo_seqnum = 1)::int )) OVER (ORDER BY to_char(transaction_date, 'YYYY-MM')) as uniques_through_month
FROM combos
GROUP BY to_char(transaction_date, 'YYYY-MM')

Здесь - это тестер, иллюстрирующий решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...