用于查找具有相同值集的行的SQL查询
假设我有下表用于查找具有相同值集的行的SQL查询,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,假设我有下表 Customer_ID Item_ID 1 A 1 B 2 A 2 B 3 A 我需要的是找到购买同一套商品的客户。 输出: id1
Customer_ID Item_ID
1 A
1 B
2 A
2 B
3 A
我需要的是找到购买同一套商品的客户。
输出:
id1Customer_id Customer_id
id1 id2
id2 id3
id1 id3
谢谢,试试这个。其思想是利用外部联接和count忽略null的事实
select t1.customer_id, t2.customer_id
from tbl t1
left join tbl t2
on t1.customer_id < t2.customer_id
and t1.item_id = t2.item_id
group by t1.customer_id, t2.customer_id
having count(t1.item_id) = count(t2.item_id)
就你而言:
create table CustomerAA (
Customer_Id int ,
ItemId varchar(10)
);
Insert Into CustomerAA(Customer_Id,ItemId) values(1,'A')
Insert Into CustomerAA(Customer_Id,ItemId) values(1,'B')
Insert Into CustomerAA(Customer_Id,ItemId) values(2,'A')
Insert Into CustomerAA(Customer_Id,ItemId) values(2,'B')
Insert Into CustomerAA(Customer_Id,ItemId) values(3,'A')
您可以像上面那样使用左连接:
Select Distinct C1.Customer_Id , C2.Customer_Id
From CustomerAA As C1
Left Join CustomerAA As C2 on ( C1.ItemId = C2.ItemId )
Where
( C1.Customer_Id < C2.Customer_Id )
或
我找到了解决问题的办法。 首先,我创建了临时表。此teable有一列,列中有每个客户购买的不同项目的数量。 看起来是这样的:
Customer_ID Item_Id num
1 A 2
1 B 2
2 A 2
2 B 2
3 A 1
下一个是查询
声明@tmp表
客户ID int,
物品编号nvarcharmax,
num int
插入@tmp
选择tbl.Customer\u Id、tbl.ItemId、A.num
来自tbl
内连接
选择Customer_Id,COUNTDISTINCT ItemId作为num
来自tbl
按客户标识A分组
在tbl.Customer\u Id=A.Customer\u Id上
之后,我使用下一个查询
选择t1.Customer\u Id,t2.Customer\u Id
来自@tmp t1
内部连接@tmp t2
在t1.Customer\u IdCustomer_ID Customer_ID
1 2
中间有一个枚举,但相同的事物
with cte as ( SELECT [sID], [enumID], [valueID], count(*) over (partition by [sID], [enumID]) as ccount
FROM [docMVenum1]
WHERE [sID] < 10000 )
select [cte1].[sID], [cte2].[sID], [cte1].[enumID] -- , [cte1].[valueID], [cte1].[ccount]
from cte as [cte1]
join cte as [cte2]
on [cte1].[sID] < [cte2].[sID]
and [cte1].[enumID] = [cte2].[enumID]
and [cte1].[valueID] = [cte2].[valueID]
and [cte1].[ccount] = [cte2].[ccount]
group by [cte1].[sID], [cte2].[sID], [cte1].[enumID], [cte1].[ccount]
having count(*) = [cte1].[ccount]
order by [cte1].[sID], [cte2].[sID] --, [cte1].[enumID], [cte1].[valueID];
C1.Item_ID=C2.Item_ID并不意味着集合相等。在上面的示例中,客户1和客户2具有相同的项目集。但是第二名和第三名并不相等。你们有sql server 2012吗?
Select Distinct C1.Customer_Id , C2.Customer_Id
From CustomerAA As C1
Inner Join CustomerAA As C2
on (
( C1.ItemId = C2.ItemId )
And
( C1.Customer_Id < C2.Customer_Id )
)
Customer_ID Item_Id num
1 A 2
1 B 2
2 A 2
2 B 2
3 A 1
Customer_ID Customer_ID
1 2
with cte as ( SELECT [sID], [enumID], [valueID], count(*) over (partition by [sID], [enumID]) as ccount
FROM [docMVenum1]
WHERE [sID] < 10000 )
select [cte1].[sID], [cte2].[sID], [cte1].[enumID] -- , [cte1].[valueID], [cte1].[ccount]
from cte as [cte1]
join cte as [cte2]
on [cte1].[sID] < [cte2].[sID]
and [cte1].[enumID] = [cte2].[enumID]
and [cte1].[valueID] = [cte2].[valueID]
and [cte1].[ccount] = [cte2].[ccount]
group by [cte1].[sID], [cte2].[sID], [cte1].[enumID], [cte1].[ccount]
having count(*) = [cte1].[ccount]
order by [cte1].[sID], [cte2].[sID] --, [cte1].[enumID], [cte1].[valueID];