2015-08-05 7 views
0

У меня есть таблица t1:Выбор последней строки в разделе в энцефалопатией

c1 | c2 | c3| c4 
1 1 1 A 
1 1 2 B 
1 1 3 C 
1 1 4 D 
1 1 4 E 
1 1 4 F 
2 2 1 A 
2 2 2 A 
2 2 3 A 

Я хочу, чтобы выбрать последнюю строку каждого c1, c2 пары. Итак, (1,1,4, F) и (2,2,3, A) в этом случае. Моя идея - сделать что-то вроде этого:

create table t2 as 
select *, row_number() over (partition by c1, c2 order by c3) as rank 
from t1 

create table t3 as 
select a.c1, a.c2, a.c3, a.c4 
from t2 a 
inner join 
(select c1, c2, max(rank) as maxrank 
from t2 
group by c1, c2 
) 
on a.c1=b.c1 and a.c2=b.c1 
where a.rank=b.maxrank 

Будет ли это работать? (Вопросы окружающей среды Имея поэтому не может проверить себя)

+0

mysql не имеет функции 'row_number'. –

+0

Отредактировано для удаления тега mysql, извините за это. – Danzo

+0

Нет подсказки о hiveql, но я думаю, вы должны иметь возможность изменить 'row_number()', чтобы он упорядочивался по убыванию. Затем вы можете просто выбрать строки с «rank = 1». –

ответ

2

Просто используйте подзапрос:

select t1.* 
from (select t1.*, row_number() over (partition by c1, c2 order by c3 desc) as rank 
     from t1 
    ) t1 
where rank = 1; 

Обратите внимание на использование desc для order by.

+0

заказ c4 desc тоже требуется. –

+0

Но поскольку у нас одинаковые c3, не будет ли он выбирать строку (1,1,4, D)? Кроме того, столбец c4 необязательно упорядочен. @vkp – Danzo

+0

@ Danzo. , , Этот запрос произвольно выбирает одну из строк с максимальным значением 'c3'. Вопрос не совсем объясняет, что это значит. Для сравнения используется только код 'c3'. Если 'c4' является частью сравнения, просто используйте' order by c3 desc, c4 desc', но я не уверен, что это ваше намерение. –

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