SQL Query Group и получить более свежее состояние - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть таблица Oracle SQL:

ID | State | Date
x  |  A    | 18-01-01
x  |  B    | 18-01-02
x  |  C    | 18-01-03
y  |  D    | 18-01-04
y  |  E    | 18-01-05
y  |  F    | 18-01-06
z  |  G    | 18-01-07
z  |  H    | 18-01-08
z  |  I    | NULL

Я должен написать запрос, который возвращает мне последнее состояние для идентификатора:

ID | State | Date
X  |  C    | 18-01-03
Y  |  F    | 18-01-06
Z  |  I    | NULL

Как я могу это сделать?

Спасибо.

Ответы [ 4 ]

0 голосов
/ 06 декабря 2018

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

select   id
     ,   min(state) keep (dense_rank last order by dt) as state
     ,   max(dt) as dt
from     <your_table>
group by id
order by id  --  if needed
;

Ключевые слова Oracle, такие как date, не должны использоваться в качестве имен столбцов.,Я изменил это на dt.

0 голосов
/ 06 декабря 2018

Использовать ROW_NUMBER ()

Select id,state,date
FROM
(
select id,
       ROW_NUMBER() OVER(partition by id order by date desc) as state,
       date 
from mytable
)a
WHERE state=1;
0 голосов
/ 06 декабря 2018

Я бы просто использовал агрегирование, используя keep:

select id,
       max(state) keep (dense_rank first order by date desc) as state,
       max(date) as date
from t
group by id;
0 голосов
/ 06 декабря 2018

использовать first_value после даты сортировки по desc

  select distinct id, first_value(state)    over(partition by state order by date desc)  as 
  state,date from tbl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...