[英]SQL query to find all combinations in a shopping cart and their occurrence
我有一個包含兩列的表,即[USER]和[ITEM]。 每個項目都不會出現多次。
該表的示例可能是:
[USER] [ITEM]
A 001
A 002
B 002
B 001
B 003
C 001
我想提取使用SQL購買過的所有項目序列。 在這種情況下:
[SEQUENCE] [OCCURRENCES] [LENGTH SEQUENCE]
001 3 1
002 2 1
003 1 1
001-002 2 2
001-002-003 1 3
我相信將數據排序到表中的最佳方法是:
[SEQUENCE] [ITEM] [OCCURENCES] [LENGTH SEQUENCE]
1 001 3 1
2 002 2 1
3 003 1 1
4 001 2 2
4 002 2 2
5 001 1 3
5 002 1 3
5 003 1 3
我發現這篇文章“ SQL查詢最流行的組合 ”,但它僅提取2個元素的組合。
您對如何獲得這種輸出有任何想法嗎? 謝謝!
要進行這種頻率分析,您需要一種方法來創建每次交易中購買的產品的所有組合。 為此,遞歸SQL是必經之路。
從購買表開始:
create table purchases (id varchar(6), product varchar(6));
insert into purchases
values ('A','001')
,('A','002')
,('B','002')
,('B','001')
,('B','003')
,('C','001');
我們使用以下遞歸查詢來生成每個交易的所有購買組合,每個組合最多限制5個項目(您可以根據需要更改該限制),然后按照遞歸公用表表達式對查詢中生成的組合執行頻率分析:
with recur(id, length, combo, lastitem) as (
-- Anchor Query
select p.id, 1, cast(product as varchar(max)), product from purchases p
union all -- Recursive Part
select r.id, length+1, combo+','+product, product
from recur r
join purchases p
on p.id = r.id
and p.product > r.lastitem
where r.length < 5
)
-- Output query
select length, combo, count(*) frequency
from recur
group by length, combo
order by frequency desc
, length desc
, combo;
根據給定的數據得出以下結果:
length | combo | frequency
-----: | :---------- | --------:
1 | 001 | 3
2 | 001,002 | 2
1 | 002 | 2
3 | 001,002,003 | 1
2 | 001,003 | 1
2 | 002,003 | 1
1 | 003 | 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.