搜索结果中最多两列

Posted

技术标签:

【中文标题】搜索结果中最多两列【英文标题】:Max of two Columns, within found set 【发布时间】:2016-07-14 15:50:55 【问题描述】:

我有一个很大的活动拉动,我必须在一个表中获取选定 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 

我在之前的集合中使用了 group by ca.matter_key 和 Max(ca.activity_key) 的组合使用标准,但是我需要预先选择的 matter_keys,这是一个很大的列表。另外,在 ca.activity_key() 中的 Where 是提取此列表的最有效方法吗?

感谢您的帮助!

【问题讨论】:

Matter_keys 48870245061591 是从哪里来的……?您的查询已经在 Matter_key 列上进行过滤,而这些不在查询中。 抱歉,为了便于阅读,我手动删除了行,它们一定已经被清除了。 【参考方案1】:

你可以使用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;

【讨论】:

运行前的问题:为什么选择 CA.* 而不是 ca.matter_key、c​​a.activity_key、c​​a.actrow1、..?我问是因为它是一个非常广泛(而且效率很低)的数据库。 如果您从 Ca 中选择所有列,如您的问题所示,没关系 啊,我明白了。抱歉,我在示例中只给出了部分列,因为我认为它们不是问题的重点。实际的 select 查询是 20 列左右,表是 120 左右(和以前一样,一个效率极低的表!) @rattacat 。 . .我只是缩短了select,因为它与真正的问题无关并且更容易输入。【参考方案2】:

你也可以在下面使用

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

【讨论】:

【参考方案3】:

不确定我是否在这里遗漏了什么,但肯定就这么简单:

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

【讨论】:

【参考方案4】:
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)

【讨论】:

以上是关于搜索结果中最多两列的主要内容,如果未能解决你的问题,请参考以下文章

spring-eureka 源码解读----为什么一个服务最多两分钟被其他服务感知

hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp

Excel VBA 一次搜索最多可搜索 15 个值

TSQL - 如何从一个结果集中的多个表中加入 1..*?

css里面怎么让文字长的时候两行显示,最多两行,多余的省略号显示,最重要的是支持ie浏览器,

kuangbin专题 专题二 搜索进阶 Nightmare Ⅱ HDU - 3085