Исходные данные: таблица, скажем, такая:
create table CAR
(
id VARCHAR2(254),
idsession NUMBER(15),
model VARCHAR2(254),
country VARCHAR2(254),
color VARCHAR2(254),
selled NUMBER(1),
sellDate DATE
)
idsession
- номер сессии, в которой были залиты данные.
В ней много очень похожих данных, различающихся на одно-два поля, примерно так:
id | idsession | model | country | color | selled | sellDate |
-----------------------------------------------------------------------------
1 | 1001 | granta | rus | green | 1 | 2013-02-14 |
1 | 1002 | granta | rus | null | 1 | 2014-04-20 |
1 | 1003 | granta | null | blue | 1 | 2013-02-14 |
2 | 1001 | priora | rus | green | 0 | null |
2 | 1002 | priora | null | null | 1 | 2010-07-02 |
2 | 1004 | priora | ukr | null | 0 | null |
Хочу одним запросом получить такие данные:
id | idsession | model | country | color | selled | sellDate |
-----------------------------------------------------------------------------
1 | 1003 | granta | rus | blue | 1 | 2014-04-20 |
2 | 1004 | priora | ukr | green | 1 | 2010-07-02 |
То есть, считаем, что совокупность id и model дает уникальную запись, а значения полей country и color берем из последней сессии, в которой было залито ненулевое значение поля (отдельно ищем последнее ненулевое значение color и отдельно country).
Поля selled и sellDate отбираются таким образом, что ищется максимальное (для данной уникальной записи) значение sellDate и соответствующее ему значение selled.
Пока что сумел сделать это только в несколько запросов, основной, получающий уникальные записи с отобранным значением sellDate такой:
select c.id
,c.idsession
,c.model
,c.country
,c.color
,c.selled
,c.sellDate
from (
select c.id
,c.idsession
,c.model
,c.country
,c.color
,c.selled
,c.sellDate
,row_number() over (partition by c.id order by c.sellDate) rn
from car c
group by c.id
,c.idsession
,c.model
,c.country
,c.color
,c.selled
,c.sellDate
) t
where t.rn = 1;
Потом еще два тривиальных запроса на доставание последнего ненулевого color и country.
Короче, можно ли это запихнуть один запрос? Если можно, то в какую сторону смотреть?