表sql server中所有可能的记录组合

时间:2014-08-08 22:11:08

标签: sql sql-server database

我有一张桌子

declare @table table(t varchar(50), d varchar(50), activ varchar(10), groupid int, rownum int)


   insert into @table values('ALK','ceri', '0.2',1,1)
   insert into @table values('ALK','criz', '24',1,2)
   insert into @table values('EGFR','erlo', '2',2,3)
   insert into @table values('EGFR','gefi', '57',2,4)
   insert into @table values('EGFR','ibru', '5.6',2,5)
   insert into @table values('EGFR','ceri', '900',2,6)
   insert into @table values('EGFR','cetu', 'NULL',2,7)
   insert into @table values('EGFR','afat', '10',2,8)
   insert into @table values('EGFR','lapa', '10.8',2,9)
   insert into @table values('EGFR','pani', 'NULL',2,10)

insert into @table values('ERBB2','pert', 'NULL',3,11)
insert into @table values('ERBB2','tras', 'NULL',3,12)
insert into @table values('ERBB2','lapa', '9.2',3,13)
insert into @table values('ERBB2','ado-', 'NULL',3,14)
insert into @table values('ERBB2','afat', '14',3,15)
insert into @table values('ERBB2','ibru', '9.4',3,16)
输出中的

我需要groupid或t格式的所有组合 t,d,t,d,t,d,激活等等我将获得最佳组合。

任何帮助将不胜感激。这将向医生展示癌症患者的最佳药物组合。该表是动态的,每个患者都不同。

谢谢

2 个答案:

答案 0 :(得分:1)

对于所有可能的组合,您将使用CROSS JOIN:

SELECT * FROM table1 AS t1
CROSS JOIN table2 AS t2
on t1.ID = t2.ID

请注意,这会产生O(n^2)结果集,对于大型数据集可能会很大。

答案 1 :(得分:0)

我将使用#TT来表示表变量,因为调用@table可能会有点令人困惑 我还将active的数据类型更改为float

实际上有3种可能的交叉连接

-- #1 -- producing 256 rows
select * from #TT as T1
cross join #TT as T2 

-- #2 -- produces 104 rows
select * from #TT as T1
cross join #TT as T2 
where T1.GroupID = T2.GroupID

-- #3 -- produces 104
select * from #TT as T1
cross join #TT as T2 
where T1.t = T2.t

第一个是整个桌子上真正的交叉连接。

第二和第三是分别在GroupID和t上的交叉连接,但它们是相同的,因为第1组代表T =' ALK'等。这很容易确认,因为2&的并集。 3 3也产生104行

但是,如果你将select *改为

,那么在自联接中选择*是很愚蠢的
select T1.*, '===', T2.*

您可以看到' ==='左侧的列。与' ==='

右侧的列相同

由于GroupID是一个整数,我会将交叉连接写为

select T1.* from #TT as T1
cross join #TT as T2 
where T1.GroupID = T2.GroupID

既然海报想要根据最小的总活动进行分组,我认为通过GroupID和T和D分组响应是有意义的,并通过GroupID和sum(Activ)来报告Activ和order的总和

-- #4 adding group by and sum -- 16 rows generated
select T1.groupid, T1.t, T1.d, sum(T1.activ) as SumActiv
from #TT as T1
cross join #TT as T2 
where T1.groupid = T2.groupid
group by T1.t, T1.groupid, T1.d 
order by groupid, sum(T1.Activ)

现在你已经接近了,除了所有

都不需要CROSS JOIN这一事实
-- #5 remove the cross join
select T1.groupid, T1.t, T1.d, sum(T1.activ) as SumActiv
from #TT as T1
group by T1.t, T1.groupid, T1.d 

当我删除查询的交叉连接部分时,我得到完全相同的结果。我认为我们终于有了想要的东西,可能除了除了GroupID和d的每个组合的第一行之外的所有行