2016-12-16 3 views
1

Diese Frage unterscheidet sich von Get top 1 row of each group. In meiner Frage besteht jede Gruppe aus zwei Spalten (Spalte1, Spalte2), während in seiner Frage jede Gruppe aus nur einer Spalte (Spalte1) besteht. Ich habe auch versucht, die Antwort in seiner Frage zu ändern, aber gescheitert.Get obere n Zeile jeder Gruppe von zwei Spalten

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 ... 

Was ich versucht ...select *, row_numne() over (partition by (col1, col2) order by ...

Antwort

1

können Sie noch row_number verwenden innerhalb eines CTE. Die Idee ist es, alle Zeilen zu erhalten, pro Ihrer Gruppierung, dass < ist = die Nummer, die Sie in übergeben. Dies ist ähnlich wie die oben n Zeilen für Ihre Paarung immer basierend auf der Reihenfolge von 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

warum nicht einfach max für Sie?

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

MAX() funktioniert fo r die Stichprobendaten, aber gibt es irgendeine Garantie, dass alle Daten (im Gegensatz zur Gruppierung) Spalten in der obersten Zeile immer den größten Wert für einen möglichen Gruppierungssatz haben? Wenn Ihre Abfrage beispielsweise in jeder Rechnung nach der Zeile mit den meisten Artikeln gesucht hat, würde eine Rechnung mit 1 Zeile mit 100 $ 1,00 Artikeln und 1 Zeile mit 1 $ 100 Artikel eine Zeile mit 100 $ 100 Artikeln anzeigen, wenn MAX() ist benutzt. Kreuzkorrelation ist stattdessen erforderlich. –

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] 

Returns

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

Wahrscheinlich schneller als der CTE. Bessere Idee – scsimon

+0

@Scsimon kann sich nicht vorstellen, viel Unterschied, egal ... –

+0

@scsimon Art eines trüben Tages für Fragen. Ich hatte nur eine, die meine Aufmerksamkeit erweckte http://stackoverflow.com/questions/41190208/measure-application-performance-by-clustering-sql-audit-records/41192265#41192265 –

0

Und hier ist die CROSS Option gilt, mit Testtabellen seine Funktionalität zu bestätigen:

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 
Verwandte Themen