Как упорядочить значения внутри группы по - PullRequest
5 голосов
/ 22 июня 2011

Рассмотрим следующую таблицу SQL Server:

  ID  |   X   |   Y
------+-------+-------
   1  |   1   |   1
   2  |   1   |   2
   3  |   1   |   3
   4  |   2   |   40
   5  |   2   |   500
   6  |   3   |   1
   7  |   3   |   100
   8  |   3   |   10

Мне нужно выбрать идентификатор строки с максимальным значением Y, сгруппированной по x, то есть:

  ID  |   X   |   Y
------+-------+-------
   3  |   1   |   3
   5  |   2   |  500
   7  |   3   |  100

Запрос будет вложен несколько раз, поэтому требуется решение с оптимальной производительностью ...

Ответы [ 4 ]

4 голосов
/ 22 июня 2011

Установка:

 declare @MyTable table(ID int, X int, Y int)

 insert @MyTable
 values
    (   1  ,   1   ,   1),
    (   2  ,   1   ,   2),
    (   3  ,   1   ,   3),
    (   4  ,   2   ,   40),
    (   5  ,   2   ,   500),
    (   6  ,   3   ,   1),
    (   7  ,   3   ,   100),
    (   8  ,   3   ,   10)

Запрос:

;with cte
as
(
    select *, row_number() over(partition by X order by Y desc) RowNumber
    from @MyTable
)
select Id, X, Y
from cte
where RowNumber = 1

Результат:

Id          X           Y
----------- ----------- -----------
3           1           3
5           2           500
7           3           100

Запрос для MS SQL 2005+. Настройка будет работать в MS SQL 2008 +.

2 голосов
/ 22 июня 2011

Да, много раз этот тип вопросов ... Добавлено ключевое слово "STRAIGHT_JOIN", чтобы предварительно оптимизировать запрос, сначала принудительно введя "PreQuery".

select STRAIGHT_JOIN
      YT.*
   from 
      ( select x, max(y) HighPerX
           from YourTable 
           group by x ) PreQuery
      join
         YourTable YT
            on PreQuery.X = YT.X 
            AND PreQuery.HighPerX = YT.y
1 голос
/ 22 июня 2011

Также посмотрите, что вы можете сделать с помощью функции row_number () http://beyondrelational.com/blogs/madhivanan/archive/2007/08/27/multipurpose-row-number-function.aspx

1 голос
/ 22 июня 2011
...