SQL Для каждых двух позиций A и B, на какой частоте покупается B после A - PullRequest
0 голосов
/ 06 октября 2019

У меня есть таблица, в которой перечислены товары, которые были в каждой транзакции, и последовательность, в которой они были приобретены.

sequence ID = 1 означает, что это первый товар, sequence ID = 2 означает, что это второй товар.

transaction_id  item.id   sequence_id    transection_time
---------------------------------------------------------
  1                1            1           12:00:00.000
  1                1            2           12:00:00.000
  1                2            3           12:00:00.000     
  2                1            1           12:10:00.000      
  2                2            2           12:10:00.000 
  2                3            3           12:10:00.000           

Я хочу сделать запрос, который представляет для каждых двух предметов, например, 1 и 2, с какой периодичностью 1 покупается после 2.

уточнение:

  • 2 покупается после 1, если они оба появляются в транзакции, а 2 идентификатора последовательности выше, чем 1

  • случаев, когда предмет, купленный дважды в одной и той же транзакции, не считается, например, элемент 1, купленный после пункта 1 в той же транзакции, не учитывается.

из моей таблицы, ответ должен быть

p.before        p.after   frequency(hour)
--------------------------------------
  1                2            2/60       
  1                3            1/60    
  2                3            1/60     

1 Ответ

0 голосов
/ 06 октября 2019

Хммм. ,,это звучит как самостоятельное соединение:

select t1.item_id, t2.item_id, count(distinct t1.transaction_id)
from transactions t1 join
     transactions t2
     on t1.transaction_id = t2.transaction_id and
        t1.sequence_id < t2.sequence_id and
        t1.item_id <> t2.item_id
group by t1.item_id, t2.item_id;

Обратите внимание, что транзакция может (по крайней мере теоретически) иметь 1 -> 2 -> 1. Такая транзакция будет учитываться как для (1, 2). ) и (2, 1).

Здесь - это дб <> скрипка.

...