Выбор первой строки для группы

sql sql-server sql-server-2008

18723 просмотра

3 ответа

6027 Репутация автора

У меня есть таблица с тремя столбцами: A,B,C.

Значения:

+---+-----+----+
| A |  B  | C  |
+---+-----+----+
| 1 | -10 |  5 |
| 1 |   0 |  5 |
| 1 |  10 |  5 |
| 2 |  10 | 12 |
| 2 |   0 | 12 |
| 3 | -10 | 14 |
| 4 |   0 |  8 |
| 4 |  10 |  8 |
| 5 |   0 |  6 |
| 5 |   1 |  6 |
| 5 |  -5 |  6 |
+---+-----+----+

Если бы я сначала упорядочил данные по столбцу A, а затем по столбцу B, а затем по столбцу C(хотя я сделал все Cзначения столбцов одинаковыми для каждого Aзначения столбца ), как выбрать «первую строку» для столбца A?

Итак, это должно привести к:

+---+-----+----+
| A |  B  | C  |
+---+-----+----+
| 1 | -10 |  5 |
| 2 |   0 | 12 |
| 3 | -10 | 14 |
| 4 |   0 |  8 |
| 5 |  -5 |  6 |
+---+-----+----+
Автор: mezamorphic Источник Размещён: 07.06.2012 10:52

Ответы (3)


16 плюса

349129 Репутация автора

Решение
SELECT  a, b, c
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY a ORDER BY b, c) rn
        FROM    mytable
        ) q
WHERE   rn = 1
ORDER BY
        a

или же

SELECT  mi.*
FROM    (
        SELECT  DISTINCT  a
        FROM    mytable
        ) md
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable mi
        WHERE   mi.a = md.a
        ORDER BY
                b, c
        ) mi
ORDER BY
        a

Создайте составной индекс, (a, b, c)чтобы запросы работали быстрее.

Какой из них более эффективен, зависит от вашего распределения данных.

Если у вас есть несколько разных значений, aно в каждой записи много записей a, второй запрос будет лучше.

Вы можете улучшить его еще больше, создав индексированное представление:

CREATE VIEW v_mytable_da
WITH   SCHEMABINDING
AS
       SELECT  a, COUNT_BIG(*) cnt
       FROM    dbo.mytable
       GROUP BY
               a

GO

CREATE UNIQUE CLUSTERED INDEX
       pk_vmytableda_a
ON     v_mytable_da (a)

GO

SELECT  mi.*
FROM    v_mytable_da md
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable mi
        WHERE   mi.a = md.a
        ORDER BY
                b, c
        ) mi
ORDER BY
        a
Автор: Quassnoi Размещён: 07.06.2012 10:55

1 плюс

10490 Репутация автора

Это классическая проблема и была задана ранее

Как выбрать первую строку для каждой группы в запросе SQL?

Выберите первую строку в каждой группе GROUP BY?

Хорошая поисковая фраза: «выберите первую строку в группе SQL Server»

Автор: buckley Размещён: 07.06.2012 10:57

0 плюса

1 Репутация автора

SELECT *
FROM
  (SELECT *,
          ROW_NUMBER() OVER (PARTITION BY Dealld
                             ORDER BY Price, Dealld) rn
   FROM DealOffers) q
WHERE rn = 1
ORDER BY Name
Автор: Anil Kumar Размещён: 20.06.2016 06:28
Вопросы из категории :
32x32