2010-07-30 2 views
4

У меня есть 3 колонки/поля как часть общего списка: strID, seq, unit
есть куча strID с, которые принадлежат к одной и той же единицы, и каждый из них имеет различное seq , Меня интересует строка, которая имеет минимум seq за unit (лидер группы). Как я мог бы выполнить это с запросом LINQ (запрос tsql также был бы точным)?как выбрать верхнюю 1 из каждой группы после того, по

Ниже приведен пример данных:

strID, seq, unit 
    aaa, 3, 1 
    bbb, 2, 1 
    ccc, 4, 1 
    ddd, 8, 2 
    eee, 15,2 
    fff, 7, 2 

Мой запрос получит мне следующее:

leaderID, unit 
bbb, 1 
fff, 2 
+1

Незнайка о LINQ, но это ROW_NUMBER вещь (предполагая, что SQL Server 2005+) –

ответ

0

Попробуйте это для размера:

select x.strID, a.unit 
    from (select unit, MIN(seq) as seq from myTable group by unit) a 
    join myTable x 
    on a.unit = x.unit and a.seq = x.seq 
+0

Вам не нужно автообъединение таблицы, используйте функцию окна (см мой пост ниже). – Frank

+0

Функция окна может иметь для вас больше смысла, но я думаю, что это намного яснее. – Fosco

0

Попробуйте это ..

set nocount on 
go 
WITH MyTable AS 
( 
SELECT 'aaa' [strID], 3 seq, 1 unit 
UNION SELECT 'bbb', 2, 1 
UNION SELECT 'ccc', 4, 1 
UNION SELECT 'ddd', 8, 2 
UNION SELECT 'eee', 15,2 
UNION SELECT 'fff', 7, 2 
) 
, 
MinSequence AS 
(
    SELECT Unit, Min (Seq) MinSequence 
    FROM MyTable 
    Group BY Unit 
) 
SELECT MT.* 
FROM MyTable MT 
    JOIN MinSequence MS 
     ON MT.Unit = MS.Unit 
     AND MT.Seq = MS.MinSequence 

приводит

strID seq   unit 
----- ----------- ----------- 
bbb 2   1 
fff 7   2 
4

В T-SQL, можно использовать

SELECT leaderID, unit 
FROM (
    SELECT strID, unit, row_number() over(partition by unit order by seq asc) as ranking_within_unit 
    FROM t 
    ) 
WHERE ranking_within_unit = 1 

оконной функции (OVER()) сделаны для этой цели.

5
source 
    .GroupBy(row => row.unit) 
    .Select(g => g.OrderBy(row => row.seq).First()); 
Смежные вопросы