我有一张桌子
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,激活等等我将获得最佳组合。
任何帮助将不胜感激。这将向医生展示癌症患者的最佳药物组合。该表是动态的,每个患者都不同。
谢谢
答案 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的每个组合的第一行之外的所有行