Выборка одно из значений группировки в SQL

FinderA
Дата: 16.09.2015 21:59:39
Заранее извиняюсь, если не тот раздел выбрал. Вопрос не Oracle-специфичный, а скорее относится к общему sql.
Имеется таблица подключенных услуг - клиент, услуга, статус.
КлиентСтатусДата
Клиент1Включен 01.01.1970
Клиент1Отключен 01.01.1971
Клиент2Включен 01.02.1971
Клиент2Включен 01.01.1971
Клиент2Отключен 03.01.1971
Клиент3Отключен 01.04.1972
Клиент3Включен 01.01.1973

Статус клиента определяется последней по дате записью.
Прошу помочь выбрать по одной последней(по дате) записи для каждого клиента.
JDS
Дата: 16.09.2015 22:55:23
Макс(статус) кип денсранк ласт ордер бай дата? )
Ну или роунум овер патишн бай клиент ордер бай дата
Ну и пр. варианты)
FinderA
Дата: 16.09.2015 23:18:07
Спасибо конечно, но я совсем не понял, что вы написали.

Я могу сделать так.
select Клиент, Статус, Max(Дата) from table
group by Клиент, Статус

и получу по два поля на каждого клиента с двумя разными статусами, а мне нужен только последний.

Если я из группировки уберу Статус, то получу последнюю запись для каждого клиента.
select Клиент, Max(Дата) from table
group by Клиент

Но не получу Статус, а мне его надо знать наряду с другими полями.
Видимо надо копать в сторону коррелирующих подзапросов, но что-то не соображу.
FinderA
Дата: 16.09.2015 23:46:02
Еще можно вот так.
select t1.Статус, t2.* from table t1
join
(select Клиент, Max(Дата) dt from table
group by Клиент) t2 on t1.Клиент=t2.Клиент and t1.Дата=t2.dt

Но это все же джойн не по уникальным полям, не гарантируется что соединяются одни и те же строки таблицы.
yaxta
Дата: 16.09.2015 23:54:12
FinderA
Еще можно вот так.
select t1.Статус, t2.* from table t1
join
(select Клиент, Max(Дата) dt from table
group by Клиент) t2 on t1.Клиент=t2.Клиент and t1.Дата=t2.dt

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



а что вам точно нужн напишите табличу после запроса

и где нужн

t-sql или oracle pl sql?
hardhouse
Дата: 16.09.2015 23:54:48
first_value/last_value
ProgMann
Дата: 16.09.2015 23:59:27
select Клиент, Статус, Дата from table
where (Клиент, Дата) in (select Клиент, Max(Дата)) from table group by Клиент)
JDS
Дата: 17.09.2015 00:10:22
+
with t as (select 'Клиент1' client,	'Включен' status,	to_date('01.01.1970', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент1',	'Отключен', to_date('01.01.1971', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент2',	'Включен', to_date('01.02.1971', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент2',	'Включен', to_date('01.01.1971', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент2',	'Отключен', to_date('03.01.1971', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент3',	'Отключен', to_date('01.04.1972', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент3',	'Включен',  to_date('01.01.1973', 'dd.mm.yyyy') hist_date from dual)
select client, max(status) keep(dense_rank last order by hist_date) last_status
  from t
 group by client
-- ну и прочие вариации на тему ) 
-- если полей на выходе много, не пробовал, но можно попробовать сначала вместо статуса достать rowid, потом прицепиться по ним к исходной таблице
yaxta
Дата: 17.09.2015 00:16:42
JDS
+
with t as (select 'Клиент1' client,	'Включен' status,	to_date('01.01.1970', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент1',	'Отключен', to_date('01.01.1971', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент2',	'Включен', to_date('01.02.1971', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент2',	'Включен', to_date('01.01.1971', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент2',	'Отключен', to_date('03.01.1971', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент3',	'Отключен', to_date('01.04.1972', 'dd.mm.yyyy') hist_date from dual union all
			  select 'Клиент3',	'Включен',  to_date('01.01.1973', 'dd.mm.yyyy') hist_date from dual)
select client, max(status) keep(dense_rank last order by hist_date) last_status
  from t
 group by client
-- ну и прочие вариации на тему ) 
-- если полей на выходе много, не пробовал, но можно попробовать сначала вместо статуса достать rowid, потом прицепиться по ним к исходной таблице


а зачем не исползуем с кусором?
ProgMann
Дата: 17.09.2015 00:23:59
yaxta
а зачем не исползуем с кусором?
Так ложим же с прибором!