выбор первого и последнего ряда разделов, упорядоченных по дате - PullRequest
0 голосов
/ 06 ноября 2019

Привет, у вас есть набор данных, который выглядит следующим образом enter image description here

Мне нужно написать запрос, чтобы вернуть первый и последний цвет, который выбрал каждый человек. это мой код

    Select t1.name,t1.color,min(t1.rnkmin) ,t2.color,max(t2.rnkmax) 
    From(
   Select name,color,
  Danse_rank() over(partition by name order by time asc) as rnkmin 
  From table 3) as t1 inner join (
 Select name,color,
 Danse_rank() over (partition by name order by date asc) as rnkmax 
  From table 3) as t2 on t1.name=t2.name 

но, к сожалению, я получаю ошибку, и я не понимаю, почему спасибо за помощь:)

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Вы можете использовать row_number() дважды:

select color, name, time
from (
    select
        t.*,
        row_number() over(partition by name order by time) rn_asc,
        row_number() over(partition by name order by time desc) rn_desc
    from mytable t
) t
where rn_asc = 1 or rn_desc = 1

Если вы хотите, чтобы оба цвета были в одной записи, вы можете агрегировать:

select 
    name, 
    max(case when rn_asc = 1 then color end) as first_color
    max(case when rn_desc = 1 then color end) as last_color
from (
    select
        t.*,
        row_number() over(partition by name order by time) rn_asc,
        row_number() over(partition by name order by time desc) rn_desc
    from mytable t
) t
where rn_asc = 1 or rn_desc = 1
group by name
0 голосов
/ 06 ноября 2019

Во многих базах данных самый быстрый метод будет использовать коррелированные подзапросы:

select t.*
from t
where t.time = (select min(t2.time)
                from t t2
                where t2.name = t.name
               ) or
      t.time = (select max(t2.time)
                from t t2
                where t2.name = t.name 
               ) ;

Требуется индекс для (name, time).

...