2016-12-16 54 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