2013-09-24 5 views
0

У меня есть таблица оракула, которая похожа на ту, которая ниже, где хранится имя и фамилия людей. Если фамилия принадлежит одному и тому же семейству.Выбор строки с использованием MIN или ROWNUM

LastName FirstName Age 
    =========================== 
1 miller  charls  20 
2 miller  john  30 
3 anderson peter  45 
4 Bates  andy  50 
5 anderson gary  60 
6 williams mark  15 

Мне нужно написать запрос в Oracle SQL для выбрать младший человек от каждой семьи. output shd select rows 1,3,4 and 6

Как это сделать?

+3

Пожалуйста, покажите нам, что вы пробовали. –

+0

Что делать, если это галстук? Также, как вы определяете семьи? –

+0

выберите lname, MIN (возраст) в возрасте от peopletable. Будет ли это работать? Это эффективный способ? – irappa

ответ

1

DENSE_RANK() - функция ранжирования, которая генерирует последовательное число, а для связей число сгенерированных одинаково. Я предпочитаю использовать DENSE_RANK() здесь, учитывая, что семья может иметь близнецов и т.д.

SELECT Lastname, FirstName, Age 
FROM  
     (
      SELECT Lastname, FirstName, Age, 
        DENSE_RANK() OVER (PARTITION BY LastName ORDER BY Age) rn 
      FROM tableName 
     ) a 
WHERE a.rn = 1 
+0

Хорошая мысль о близнецах –

+0

Если я уверен, что не будет близнецов (без галстука), могу ли я избавиться от DENSE_RANK? что может сделать запрос быстрее? – irappa

+0

измените его на 'ROW_NUMBER()'. или см. ответ Николая. –

2

Другой способ, немного короче :

select lastname 
    , max(firstname) keep(dense_rank first order by age) as first_name 
    , max(age)  keep(dense_rank first order by age) as age 
    from you_table_name 
group by lastname 
order by lastname 

Результат:

LASTNAME FIRST_NAME  AGE 
-------- ---------- ---------- 
Bates  andy    50 
anderson peter    45 
miller  charls    20 
williams mark    15 

И SQLFiddle Demo

+0

+1 хороший, чистый и делает работу! :) – MrSimpleMind

0

С Стандартного SQL Я хотел бы сделать, как это ...

select * 
from family f1 
where (
    select count(*) 
    from family f2 
    where 
    f2.lastname = f1.lastname 
    and 
    f2.age <= f1.age) <= 1 
order by lastname; 

Это SQL дает возможность выбрать й младший/старейшую в семье. Просто измените файл f2.age < = f1.age, например. f2.age> = f1.age и < = 1, например. < = 10 (чтобы получить 10 самых молодых/самых старых в семье).

SQLfiddle

Смежные вопросы