2016-12-16 3 views
1

Этот вопрос отличается от Get top 1 row of each group. В моем вопросе каждая группа состоит из двух столбцов (col1, col2), а в своем вопросе каждая группа состоит только из одного столбца (col1). Я также попытался изменить ответ в своем вопросе, но не смог.Получить первую строку из каждой группы из двух столбцов

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

Вы все еще можете использовать row_number в CTE. Идея заключается в том, чтобы получить все строки, в вашу группировку, то есть < = число вы передадите. Это похоже на получение верхних п строк для вашего спаривания на основе порядка АМТ

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() работает Ф.О. r образцы данных, но есть ли какая-либо гарантия, что все столбцы данных (в отличие от группировки) в верхней строке всегда будут иметь наибольшее значение для любого возможного набора группировок? Например, если ваш запрос искал строку с наибольшим количеством элементов на ней в каждом счете-фактуре, счет-фактура с 1-й строкой со 100 $ 1,00 пунктами и 1 строкой с 1 $ 100 будет сообщать о строке с 100 100 $, если MAX() используемый. Вместо этого необходима кросс-корреляция. –

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] 

Возвращает

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 
Смежные вопросы