SQL:从单列获取所有对和三元组,并将其频率计入另一列

时间:2016-08-21 18:22:21

标签: sql sql-server

输入时user_id, item_id(两个text数据)的简单表格。

问题是:从item_id列中提取所有对和三元组合的方法是什么,并将它们的频率计算在user_id上(即所有用户的1%百分比都有(1,2){ {1}}对)

我尝试过一些野蛮行为:

item_id

但什么都没有

1 个答案:

答案 0 :(得分:1)

此特定任务属于比执行更容易编写的类型:

declare @t table (
    UserId int not null,
    ItemId int not null
);

insert into @t
values
    (1, 1),
    (1, 2),
    (1, 3),
    (2, 1),
    (2, 2),
    (3, 2),
    (3, 3),
    (4, 1),
    (4, 4),
    (5, 4);

-- Pairs
select t1.ItemId as [Item1], t2.ItemId as [Item2], count(*) as [UserCount]
from @t t1
    inner join @t t2 on t1.UserId = t2.UserId and t1.ItemId < t2.ItemId
group by t1.ItemId, t2.ItemId
order by UserCount desc, t1.ItemId, t2.ItemId;

正如您所看到的,这里有一个半笛卡尔(三角形)连接,这意味着随着记录数量的增加,性能将迅速下降。当然,正确的索引对于这种查询至关重要。

理论上,您可以轻松扩展此方法以识别三元组,但可能会证明您的实际数据不可行。理想情况下,应使用每行方法计算此类事物,并缓存结果。