2017-10-05 97 views
1

我必须找到按acco_key分组的最大oras_key。因此,如果acco_key = 5,并且出现在oras_Key =(1,4,5,7)中,结果应该是oras_key = 7,acco_key = 5(最大的oras_key)。 这是问题的一部分。查找其他列之前的列中的最大值

问题的其他部分: 我必须找到所有这些记录 - 最大的oras_key,按acco_key分组。 之后,排序必须由oras_key完成。

我已经alreday尝试分组,但我不知道如何找到最大的oras_key,如果我通过acco_key分组?

这里是表,数据和所需的输出:

+----------+----------+----------+ 
| oras_key | merc_key | acco_key | 
+----------+----------+----------+ 
|  1 |  3 |  5 | 
|  2 |  3 |  6 | 
|  3 |  3 |  7 | 
|  4 |  3 |  5 | 
|  5 |  3 |  5 | 
|  7 |  3 |  5 | 
|  8 |  3 |  6 | 
|  9 |  3 |  6 | 
|  10 |  3 |  6 | 
|  11 |  3 |  8 | 
|  12 |  3 |  8 | 
|  13 |  3 |  8 | 
|  14 |  3 |  9 | 
+----------+----------+----------+ 

表定义和数据:

declare @tblTemp3 table 
(
oras_key int, 
merc_key int, 
acco_key int 
) 

insert into @tblTemp3 (oras_key, merc_key, acco_key) 
values(1, 3, 5), 
(2, 3, 6), 
(3, 3, 7), 
(4, 3, 5), 
(5, 3, 5), 
(7, 3, 5), 
(8, 3, 6), 
(9, 3, 6), 
(10, 3, 6), 
(11, 3, 8), 
(12, 3, 8), 
(13, 3, 8), 
(14, 3, 9) 

所需的输出:

+----------+----------+----------+ 
| oras_key | merc_key | acco_key | 
+----------+----------+----------+ 
|  14 |  3 |  9 | 
|  13 |  3 |  8 | 
|  10 |  3 |  6 | 
|  7 |  3 |  5 | 
|  3 |  3 |  7 | 
+----------+----------+----------+ 

回答

1

你可以试试这个:

;with cte as 
(
    select r = row_number() over (partition by acco_key order by oras_key desc) 
     , * 
    from @tblTemp3 
) 
select oras_key, merc_key, acco_key 
from cte 
where r = 1 
order by oras_key desc 

但是,好像使用MAX()功能会做太多,如果你merc_key始终是相同的:

select max(oras_key) oras_key, merc_key, acco_key 
from @tblTemp3 
group by acco_key, merc_key 
order by oras_key desc 

你可以找到一个演示here

+0

非常感谢你的努力,它的工作原理。也许你有一个关于该主题的好教程的链接? – FrenkyB

+0

嗨!您可以使用[MAX()](https://docs.microsoft.com/en-us/sql/t-sql/functions/max-transact-sql)函数的文档和[this](http:/ /mickeystuewe.com/2012/10/28/the-row_number-function-as-an-alternate-to-the-max-function/)文章。 –

1
Select max(oras_key) as oras_key,merc_key ,acco_key from @tblTemp3 group by 
acco_key,merc_key 
order by 1 desc 

希望这是你在找什么

相关问题