2015-04-15 6 views
8

У меня есть таблица вроде такВыбор одной строки, без уникального ключа

Fld1 Fld2 Fld3 
------------ 
0  1234 ABC 
0  1235 DEF 
1  1236 GHI 
2  1236 JKL 
3  1236 MNO 
4  1237 PQR 
5  1237 STU 
6  1237 VWX 

Обратите внимание, что ни один столбец является уникальным. Может быть много строк с Fld1 = 0, но для всех других значений Fld1 будет уникальным, и может быть много строк с тем же значением для Fld2.

нужно выбрать одну строку для каждого значения Fld2 с наивысшим значением в Fld 1. Таким образом, результат на основе вышеуказанных данных будет

Fld1 Fld2 Fl4 
------------------ 
0  1234 ABC 
0  1235 DEF 
3  1236 MNO 
6  1237 VWX 

ответ

7

Альтернативой GROUP BY было бы использовать функцию окон, например row_number(), чтобы получить результат. Эта функция создает уникальный номер, разбивая данные по Fld2 и заказать его Fld1 desc:

select Fld1, Fld2, Fld3 
from 
(
    select Fld1, Fld2, Fld3, 
    rn = row_number() over(partition by fld2 order by fld1 desc) 
    from yourtable 
) d 
where rn = 1; 

См SQL Fiddle with Demo. Бывают случаи, когда row_number будет проще, если у вас есть дополнительные столбцы, которые уникальны. Это дает результат:

| Fld1 | Fld2 | Fld3 | 
|------|------|------| 
| 0 | 1234 | ABC | 
| 0 | 1235 | DEF | 
| 3 | 1236 | MNO | 
| 6 | 1237 | VWX | 
1

Использование group by:

select max(fld1), fld2 
from table t 
group by fld2; 
+0

К сожалению, вопрос был неполным, теперь я добавил третье поле, которое усложняет запрос –

0

a) Получите первый результат, который имеет только две колонки, как ответ Гордонам.
b) Используйте его для запроса оставшихся столбцов.

SELECT r.* FROM table r 
INNER JOIN 
(select max(fld1), fld2 
from table t 
group by fld2) s ON (r.fld1=s.fld1 AND r.fld2=s.fld2) 
Смежные вопросы