LINUX.ORG.RU

Не осилил select

 , plsql,


0

1

Исходные данные: таблица, скажем, такая:

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.

Короче, можно ли это запихнуть один запрос? Если можно, то в какую сторону смотреть?

★★★★

Последнее исправление: HerrWeigel (всего исправлений: 3)

Сгруппируй по id и model, оставь в группах только те записи, у которых поле, нужное тебе, ненулевое, и id сессии максимальное. Если сессии имеют неупорядоченные по времени id, думаю, понятно что делать.

anonymous
()
Ответ на: комментарий от anonymous

А извини, не дочитал. Сначала сделай join таблицы с собой, чтоб разобраться с sellDate, а уже потом группируй и т.д.

anonymous
()
select a.id, e.idsession, a.model, b.contry, c.color, d.sellDate, d.selled
from car a
join (select id, model, country from car a
   join (select max(idsession) idsession, model, id from car 
         group by model, id where not country is null) b
   on a.id=b.id 
      and a.model=b.model 
      and a.idsession = b.idsession) b
on a.id = b.id and a.model = b.model
join (select id, model, color from car a
   join (select max(idsession) idsession, model, id from car 
         group by model, id where not color is null) b
   on a.id=b.id 
      and a.model=b.model 
      and a.idsession = b.idsession) c
on a.id = c.id and a.model = c.model
join (select id, model, sellDate, sell from car a
   join (select max(sellDate) sellDate, selled, model, id 
         from car 
         group by model, id) b
   on a.id=b.id 
      and a.model=b.model 
      and a.sellDate= b.sellDate) d
on a.id = d.id and a.model = d.model
join (select id, model, max(idsession) idsession from car a
      group by model, id) e
on a.id = e.id and a.model = e.model

вроде так

monk ★★★★★
()
Ответ на: комментарий от anonymous

Сейчас попробую с join сделать, правда пока не понимаю, как это поможет справиться с разбросанностью color и country (но я и с join пока что, к сожалению, на вы).

HerrWeigel ★★★★
() автор топика
Ответ на: комментарий от monk

Ипать. Попробую разобраться (хотя вроде это только выглядит сложно), спасибо.

HerrWeigel ★★★★
() автор топика
Ответ на: комментарий от monk

Разобрался, допилить этот запрос надо немного, но направление вроде верное ты мне задал, спасибо.

Завтра с утра допилю и выложу получившийся вариант.

HerrWeigel ★★★★
() автор топика

He selled me a shitty car, but I was telled it's good.

anonymous
()

в секцию group by - те поля, которые считаешь уникальными. а остальные в секции select оберни в MAX(поле)

bvn13 ★★★★★
()
Ответ на: комментарий от bvn13

а остальные в секции select оберни в MAX(поле)

Ему не надо MAX(поле) ему надо «значение поля напротив максимального значения idsession, где это поле не NULL»

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.