搜索结果中最多两列
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_key
s 4887024
和 5061591
是从哪里来的……?您的查询已经在 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、ca.activity_key、ca.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