2013-09-06 2 views
2

У меня есть группа детей для каждого родителя и дата для каждого ребенка, все в одной таблице. Я хотел бы: для каждого родителя найти детей с максимальной датой. Я написал заявление, которое делает только что:Поиск maxiumum в группе с одним select

create table t(
    parent string, 
    child string, 
    date date, 
); 

первичный ключ (родитель, ребенок)

select a.* 
from 
    (select parent, child, date from t) a 
    join 
    (select parent, max(date) as lastdate from t group by parent) b 
    on 
    a.parent = b.parent 
    and a.date = b.lastdate 

Теперь проблема, я делаю 2 отдельных выбирает на столе т. Скажем, таблица t огромная, и я хотел бы сделать это только с одним выбором на таблице t. Это возможно?

Я использую Oracle SQl Developer для Oracle 10g EE.

ответ

4

Вы можете использовать агрегатную функцию FIRST:

SELECT parent, 
     MAX(child) KEEP (DENSE_RANK FIRST ORDER BY date DESC) lastchild, 
     MAX(date) lastdate 
    FROM t 
GROUP BY parent 

Столбец lastchild возвращает значение child для строки, которая имеет максимальную date для этого родителя. В случае галстука (у нескольких детей одинаковый максимум date), применяется MAX.

0

Как вам нужно запечатлеть всех детей с одинаковой максимальной датой, если я правильно прочитал ваш исходный вопрос. Оператор ранга будет ранжировать всех детей с той же датой, что и тот же ранг. Я немного изменил таблицу, чтобы она работала и не противоречила ключевым словам Oracle.

create table t(
    parent varchar2(20), 
    child varchar2(20), 
    child_date date 
); 

insert into t (parent, child, child_date) values (1,'A',sysdate-1); 
insert into t (parent, child, child_date) values (1,'B',sysdate+45); 

insert into t (parent, child, child_date) values (2,'A',sysdate+45); 
insert into t (parent, child, child_date) values (2,'B',sysdate+45); 

select parent, child from (
    select parent, child, rank() over (partition by parent order by child_date desc) rnk 
    from t) 
    where rnk = 1; 
Смежные вопросы