2012-04-21 3 views
0

Как получить строки из двух верхних идентификаторов пакета не во всех строках SQL Server?Как получить строки из SQL Server на основе GROUP BY

Ex: Sample_table

tranid packid referencenum 
1   1  123456 
2   1  654982 
3   2  894652 
4   3  684521 
5   3  684651 
6   4  987566 

Основываясь на приведенном выше примере таблицы, как я получаю строки обновления 2 (для 1 и 2) для следующего экземпляра мне нужно снова 3 и 4 строки

Может кто-нибудь поможет мне разобраться с проблемой?

+2

Coiuld вы делаете его более четким, что вы хотите в результате – Mark

+1

Вы можете отправить образец данных для того, что вы хотите, чтобы ваши данные выглядеть –

ответ

0

, пожалуйста, выполните следующий запрос.

select * from sample_table group by packid; 
1

Если бы я не пропустить что-то, это:

SELECT * 
FROM PacksTable p 
WHERE p.Id IN (1, 2) 

Даст вам только данные для двух pack_id-й в таблице.

Непонятно, что вы ищете здесь. Вы можете сгруппировать по pack_id, а затем получить два верхних pack_id, но что вы хотите сделать сгруппированными значениями referencenum для сгруппированных pack_id, i.e Какую функцию агрегата вы будете использовать для этого столбца, Min, и т. Д.!.

Другими словами: Если вы ищете Top минимальной pack_id, а именно: 1, 2 в первый раз, вы должны ответить на вопрос: что агрегатная функция для использования с соответствующими значениями referencenum ?? ,

Например, вы можете использовать MIN так:

SELECT TOP(2) p.packid, MIN(p.referencenum) 
FROM PacksTable p 
GROUP BY(p.packid) 
ORDER BY p.packid 
0

вы можете использовать переменные в сочетании с DENSE_RANK функции к окну, через два packid в то время,:

create table #packing (tranid int,packid int,referencenum int) 
insert into #packing values 
    (1,1,123456) 
, (2,1,654982) 
, (3,2,894652) 
, (4,3,684521) 
, (5,3,684651) 
, (6,4,987566) 
go 

declare @i int=-1; 
declare @j int=0; 

while @@ROWCOUNT>0 begin 
    set @i+=2; 
    set @j+=2; 
    ; with a as (
     select *, dr=dense_rank()over(order by packid) from #packing 
    ) 
    select tranid, packid, referencenum 
    from a 
    where dr between @i and @j; 
end 
go 

drop table #packing 
go 

Результат:

enter image description here