找到的集合中最多两列

时间:2016-07-14 15:50:56

标签: sql sql-server sql-server-2005

我有一个很大的活动拉动,我必须在表中选择ca.matter_key的最后一个活动,由ca.activity_key(表主键)确定。我想知道最有效的方法,因为最终结果将是20K的球场。

    select distinct

    ca.matter_key,
    ca.activity_key,
    ca.actrow1,
    ca.actrow2,
    ca.actrow3,
    ca.actrow4

    FROM CaseAct ca

    where
    ca.matter_key in (
    4945046,
    5040953,
    5025296,
    5078360
    )

上面的结果将给出以下结果:

Matter_key  activity_key actrow1 actrow2 actrow3 actrow4
4945046     12           Data    Data    Data    Data    
4945046     13           Data    Data    Data    Data    
4945046     14           Data    Data    Data    Data    
5040953     35           Data    Data    Data    Data    
5040953     36           Data    Data    Data    Data    
5025296     77           Data    Data    Data    Data    
5025296     78           Data    Data    Data    Data    
5025296     79           Data    Data    Data    Data    
5078360     NULL         Data    Data    Data    Data     
4887024     93           Data    Data    Data    Data    
4887024     94           Data    Data    Data    Data    
4887024     95           Data    Data    Data    Data    
5061591     NULL         Data    Data    Data    Data    

我需要:

Matter_key  activity_key actrow1 actrow2 actrow3 actrow4 
4945046     14           Data    Data    Data    Data    
5040953     36           Data    Data    Data    Data      
5025296     79           Data    Data    Data    Data    
5078360     NULL         Data    Data    Data    Data    
4887024     95           Data    Data    Data    Data    
5061591     NULL         Data    Data    Data    Data 

我已经使用ca.matter_key分组和Max(ca.activity_key)组合使用条件在之前的集合上完成了此操作,但是我需要预选的matter_keys,这是一个很大的列表。另外,ca.activity_key()中哪个是拉这个列表最有效的方法?

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

您可以使用row_number()

select ca.*
from (select ca.*,
             row_number() over (partition by matter_key order by activity_key desc) as seqnum
      from CaseAct ca
      where ca.matter_key in (4945046, 5040953, 5025296, 5078360)
     ) ca
where seqnum = 1;

答案 1 :(得分:0)

你也可以使用下面的

select 
    ca.matter_key,
    ca.activity_key,
    ca.actrow1,
    ca.actrow2,
    ca.actrow3,
    ca.actrow4
    FROM CaseAct ca 
join
(
select matter_key,max(activity_key) as maxkey 
from
caseact ) b
on b.matter_key=ca.matter_key
  and b.maxkey=a.activity_key

答案 2 :(得分:0)

不确定我是否在这里遗漏了一些东西,但肯定是这么简单:

select ca.matter_key,
       max(ca.activity_key) activity_key,
       ca.actrow1,
       ca.actrow2,
       ca.actrow3,
       ca.actrow4
from CaseAct ca
where ca.matter_key in (4945046,
                        5040953,
                        5025296,
                        5078360)
group by ca.matter_key,
         ca.actrow1,
         ca.actrow2,
         ca.actrow3,
         ca.actrow4

答案 3 :(得分:0)

select 
a.matter_key,
a.activity_key,
a.actrow1,
a.actrow2,
a.actrow3,
a.actrow4
FROM yourtable a
join
(
select matter_key, max(isnull(activity_key, 0)) as maxi 
from yourtable ) b
on b.matter_key=a.matter_key
and b.maxi =isnull(a.activity_key, 0)