Определить модели покупки SQL - PullRequest
0 голосов
/ 27 апреля 2020

Я sh, чтобы идентифицировать участников, которые купили последовательность продуктов в моем магазине, и сохранить их данные для дальнейшего анализа.

Я заинтересован в идентификации участников, которые купили яблоки И

Мои транзакционные данные выглядят следующим образом:

za

Мои транзакционные данные выглядят следующим образом: *1009* *1010**1011**1012**1013**1014*

Из приведенных выше данных член 1 купил яблоки (4/4/2020), но до этого не покупал один или несколько ключевых продуктов (груши ИЛИ апельсины ИЛИ виноград или дыню). Тем не менее, член 2 также купил яблоки, но до этого они также купили груши (22/2/2020), поэтому они представляют интерес.

В идеале, результатом будет столбец MBR_ID и столбец с названием Interest_y_n с y, если условие соответствует или нет, если они не совпадают.

Я был бы очень признателен за любые указания о том, как решить эту проблему.

Я использую Netezza в качестве платформы базы данных, если это поможет.

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Вы также можете использовать CTE. Вот демоверсия .

with maxDate as
(select
    mbr_id,
    max(purchase_date) as mxDate
from test
where product = 'apples'
group by
    mbr_id
),

minDate as
(
  select
    mbr_id,
    min(purchase_date) as mnDate
  from test
  group by
    mbr_id
),

inter_y as
(
  select
      t.mbr_id,
      'y' as interest_y_n
  from test t
  join maxDate mx
  on t.mbr_id = mx.mbr_id

  join minDate mn
  on t.mbr_id = mn.mbr_id 

  where purchase_date between mnDate and mxDate
  and product in ('pears', 'oranges', 'grapes', 'melon')
)

select
    distinct mbr_id,
    'n' as interest_y_n
from test t
where not exists (select mbr_id from inter_y iy where t.mbr_id = iy.mbr_id)

union all

select *
from inter_y

Вывод:

*----------------------*
| mbr_id  interest_y_n |
*----------------------*
|     1        n       |
|     2        y       |
*----------------------*
1 голос
/ 27 апреля 2020

Хммм. , , Это звучит как агрегация:

select mbr_id,
       (case when sum(case when product = 'apples' then purchase_date end) >
                  sum(case when product in ('pears', 'oranges', 'grapes', 'melon') then purchase_date end)
             then 1 else 0
        end) as is_member_of_interest
from transactions t
group by mbr_id;

Условные агрегации в case сравнивают самую раннюю дату покупки «яблока» с более ранней датой для других фруктов. Значение истинно только тогда, когда яблоки были приобретены после других.

...