我有字段A
,B
,C
的以下数据:
A B C
-- -- --
1 1 90
1 2 99
1 3 75
2 1 60
2 2 54
2 3 95
3 1 85
3 2 80
3 3 9
4 1 80
4 2 85
4 3 86
4 4 87
我需要找到产生最大A
值的B
和C
对,然后选择下一个最大值,使其不包含A
或B
。在上述数据中,第一次尝试选择1, 2
,因为99
是最大值。第二个过程排除了所有带有1或2的对,因此我们留下3 3
,4 3
和4 4
,第二个最大值为4 4
。该过程继续,结果是:
A B C
-- -- --
1 2 99
4 4 87
3 3 9
如何使用SQL执行此操作?
答案 0 :(得分:0)
declare @a table (a int,b int,c int)
insert into @a values (1, 1, 90)
,(1, 2, 99)
,(1, 3, 75)
,(1, 3, 75)
,(2, 1, 60)
,(2, 2 ,54)
,(2, 3, 95)
,(3, 1, 85)
,(3, 2, 80)
,(3, 3, 9)
,(4, 1, 80)
,(4, 2, 85)
,(4, 3 ,86)
,(4, 4, 87);
Declare @rct int
Select top 1 *
into #tmp
from @a
Order by c desc
Select @rct=@@ROWCOUNT
While @rct>0
begin
Insert into #tmp
Select Top 1 a.*
from @a a
Left Join #tmp on #tmp.A=a.A or #tmp.B=a.B or #tmp.b=a.A or #tmp.A=a.b
Where #tmp.a is null and #tmp.b is null
Order by C desc
Select @rct=@@ROWCOUNT
end
Select * from #tmp
order by c desc
Drop table #tmp
有60万行,你可以试试这次尝试
declare @a table (a int,b int,c int)
insert into @a values (1, 1, 90)
,(1, 2, 99)
,(1, 3, 75)
,(1, 3, 75)
,(2, 1, 60)
,(2, 2 ,54)
,(2, 3, 95)
,(3, 1, 85)
,(3, 2, 80)
,(3, 3, 9)
,(4, 1, 80)
,(4, 2, 85)
,(4, 3 ,86)
,(4, 4, 87);
Declare @rct int
Select a,b,c
into #work
from @a -- your big table
CREATE NONCLUSTERED INDEX [i_a] ON #work (a)
CREATE NONCLUSTERED INDEX [i_b] ON #work (b)
CREATE NONCLUSTERED INDEX [i_c] ON #work (c)
Select top 1 *
into #tmp
from #work
Order by c desc
Select *
into #final
from #tmp
Delete #work
from #tmp
where #work.a=#tmp.a or #work.b=#tmp.a or #work.a=#tmp.b or #work.b=#tmp.b
While (Select COUNT(*) from #work) >0
begin
delete from #tmp
insert into #tmp
Select top 1 *
from #work
Order by c desc
insert into #final
Select *
from #tmp
Delete #work
from #tmp
where #work.a=#tmp.a or #work.b=#tmp.a or #work.a=#tmp.b or #work.b=#tmp.b
end
drop table #work
drop table #tmp
Select * from #final
drop table #final