2016-07-19 4 views
1

Вопрос основан на SQL query to select distinct row with minimum value. Рассмотрим таблицу:как выбрать один ряд из нескольких строк с минимальным значением

id game point 
1 x  1 
1 y  10 
1 z  1 
2 x  2 
2 y  5 
2 z  8 

Используя предлагаемые ответы от упомянутого вопроса (выберите идентификаторы, которые имеют минимальное значение в столбце точки, сгруппированные по игре) получаем

id game point  
1 x  1 
1 z  1 
2 x  2 

Вопрос заключается в том, как получить ответ с одним выходом для каждого идентификатора. Оба выхода

id game point  
1 x  1 
2 x  2 

и

id game point  
1 z  1 
2 x  2 

являются приемлемыми.

ответ

4

Использование row_number():

select t.* 
from (select t.*, 
      row_number() over (partition by id order by point asc) as seqnum 
     from t 
    ) t 
where seqnum = 1; 
+0

Спасибо! Замечательно. Это открытие для меня. –

+0

Что делать, если у меня есть дополнительное поле, которое я хочу разделить на ... Для примера, 'filial'. Есть ли более элегантное решение, кроме 'partition by cast (id как varchar (MAX)) + cast (filial как varchar (MAX))?? –

+0

@VadimShkaberda. , , 'раздел по id, порядковый номер на. , , '. –

-1

Мы предполагаем, что все записи точек различны (для каждого идентификатора, и это игра, поэтому мы можем получить минимум каждого идентификатора с его игрой), используя подзапрос и внутреннее соединение с двумя условиями даст вам результат, которого вы ожидаете. Если он не работает с вами, я получил другое решение:

SELECT yt.*,  
FROM Yourtable yt INNER JOIN 
    (
     SELECT ID, MIN(point) MinPoint 
     FROM Yourtable 
     GROUP BY ID 
    ) t ON yt.ID = t.ID AND yt.Record_Date = yt.MinDate 
Смежные вопросы