2016-12-16 90 views
1

这个问题不同于Get top 1 row of each group。在我的问题中,每个组由两列(col1,col2)组成,而在他的问题中,每个组只包含一列(col1)。我也尝试修改他的问题中的答案,但失败了。获得每列两列的前n行

Example: 

Suppose n = 1 

Input: 
col1 col2 x Amt 
A  B x1 100 
A  B x2 200 
C  D x3 400 
C  D x4 500 
...more data ... 

Output: 
col1 col2 x Amt 
A  B x2 200 
C  D x4 500 
...more data ... 

我试过...select *, row_numne() over (partition by (col1, col2) order by ...

回答

1

您仍然可以在CTE内使用row_number。我们的想法是让所有的行,按你的分组,即< =你传递的数量,这是类似于基于AMT

declare @count int = 1 
with cte as(
    select 
     col1, 
     col2, 
     x, 
     Amt, 
     row_number() over (partition by col1, col2 order by Amt desc) as rn 
    from yourTable) 

select 
    col1, 
    col2, 
    x, 
    Amt 
from cte 
where rn <= @count 
0

为什么不简单最大为你工作?

select col1, col2, max(x), Max(Amt) from yourtable 
    group by col1, col2 
+1

MAX()的作品FO r是否是示例数据,但有没有保证所有可能的分组集合中的最高行中的所有数据(与分组相比)列都将保持最大值?例如,如果您的查询正在查找每张发票上包含的项目最多的行,则如果MAX()为1,那么1行100美元的商品和1行1美元的商品的发票将报告100行100美元的行用过的。互相关是需要的。 –

1
Declare @Top int = 1 

Select col1,col2,x,Amt 
From (
     Select * 
       ,RN=Row_Number() over (Partition By Col1,Col2 Order By Amt Desc) 
     From YourTable) A 
Where RN<[email protected] 
的顺序获得你配对的前n行

返回

col1 col2 x Amt 
A  B  x2 200 
C  D  x4 500 
+0

可能比CTE更快。更好的主意 – scsimon

+0

@scsimon无论如何都无法想象有太大的区别......如果有的话 –

+0

@scsimon这是一个沉闷的日子,用于提问。我只有一个引起了我的注意http://stackoverflow.com/questions/41190208/measure-application-performance-by-clustering-sql-audit-records/41192265#41192265 –

0

,这里是CROSS应用选项,以测试表,以确认其功能:

DECLARE @MyTable TABLE (Col1 varchar(4) not null, Col2 varchar(4) not null, x varchar(8) not null, amt int not null) 

INSERT INTO @myTable VAlues ('A', 'B', 'x1', 100) 
INSERT INTO @myTable VAlues ('A', 'B', 'x2', 200) 
INSERT INTO @myTable VAlues ('C', 'D', 'x4', 400) 
INSERT INTO @myTable VAlues ('C', 'D', 'x3', 500) 


DECLARE @n int 
SET @n = 1 

SELECT DISTINCT 
    m.Col1, 
    m.Col2, 
    m2.x, 
    m2.Amt 
FROM @MyTable m 
CROSS APPLY (
    SELECT TOP(@n) Amt, x 
    FROM @MyTable 
    WHERE col1 = m.Col1 
     AND col2 = m.col2 
    ORDER BY Amt Desc, x Desc 
    ) m2