Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Отбор записей по минимальной дате  [new]
V.Andy
Member

Откуда: Москва
Сообщений: 29
Здравствуйте!
Подскажете, пожалуйста, как решить задачу простейшим образом в Oracle, за один проход и в одной таблице.

Есть таблица.

ID DATE SUM

A 01.01.2011 300
A 02.01.2011 400
A 03.01.2011 200
B 06.01.2011 54
B 08.01.2011 445
B 09.01.2011 778


Нужно получить для каждого ID минимальную дату и соответствующую ей сумму в поле SUM.


Т.е. на выходе должно получиться


ID DATE SUM

A 01.01.2011 300
B 06.01.2011 54


Мне видятся два варианта, которые на больших массивах данных будут работать весьма медленно

1) Первым проходом формируем таблицу с ID и min(DATE). Вторым проходом подтягиваем к ней данные по SUM из первоисточника

2) Делаем коррелирующий запрос, т.е.

Select

t.ID, t.DATE, t.SUM

From

Table t

Where

DATE =

(

Select

Max(t1.DATE)

From

Table t1

Group By t1.ID

Having

t.ID = t1.ID

)



Может быть с ходу вам видны какие-то другие более лёгкие и быстрые способы решения данной задачи?
2 ноя 11, 14:47    [11539804]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
Моржовый
Guest
V.Andy,

https://www.sql.ru/forum/actualthread.aspx?tid=892494
2 ноя 11, 14:51    [11539848]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
V.Andy,

SELECT
       T.ID, T.DATE, T.SUM
  FROM TABLE T
 WHERE (id,DATE) IN (SELECT ID,MAX(T1.DATE)
                       FROM TABLE T1
                      GROUP BY T1.ID)
2 ноя 11, 14:52    [11539873]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
Моржовый
Guest
SysOper,

И откуда сегодня столько советчиков-говнокодеров повылезало?
2 ноя 11, 14:54    [11539890]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
Моржовый
SysOper,

И откуда сегодня столько советчиков-говнокодеров повылезало?



Я не знаю откуда ты вылез :)). Давай, умник, предлагай свой вариант
2 ноя 11, 15:05    [11539986]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
11539784
2 ноя 11, 15:07    [11540007]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
dumpino
Member

Откуда: Уфа
Сообщений: 100
V.Andy,

используйте аналитические функции с использование partition by ID
2 ноя 11, 15:09    [11540022]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
11539575
2 ноя 11, 15:09    [11540029]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
ora78
Guest
SQL> with q as
  2  (
  3  select 'A' ID, '01.01.2011' dDATE, 300 nSUM from dual union all
  4  select 'A' ID, '02.01.2011' dDATE, 400 nSUM from dual union all
  5  select 'A' ID, '03.01.2011' dDATE, 200 nSUM from dual union all
  6  select 'B' ID, '06.01.2011' dDATE, 54 nSUM from dual union all
  7  select 'B' ID, '07.01.2011' dDATE, 445 nSUM from dual union all
  8  select 'B' ID, '09.01.2011' dDATE, 778 nSUM from dual
  9  )
 10  select id, min(dDate) dDate, min(nSum) KEEP (DENSE_RANK first ORDER BY dDate) nSum  from q group by id;
 
ID DDATE            NSUM
-- ---------- ----------
A  01.01.2011        300
B  06.01.2011         54
2 ноя 11, 15:15    [11540095]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
stax..
Guest
V.Andy,
Шутка

.....
stax
2 ноя 11, 15:31    [11540306]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
dumpino
Member

Откуда: Уфа
Сообщений: 100
ora78
SQL> with q as
  2  (
  3  select 'A' ID, '01.01.2011' dDATE, 300 nSUM from dual union all
  4  select 'A' ID, '02.01.2011' dDATE, 400 nSUM from dual union all
  5  select 'A' ID, '03.01.2011' dDATE, 200 nSUM from dual union all
  6  select 'B' ID, '06.01.2011' dDATE, 54 nSUM from dual union all
  7  select 'B' ID, '07.01.2011' dDATE, 445 nSUM from dual union all
  8  select 'B' ID, '09.01.2011' dDATE, 778 nSUM from dual
  9  )
 10  select id, min(dDate) dDate, min(nSum) KEEP (DENSE_RANK first ORDER BY dDate) nSum  from q group by id;
 
ID DDATE            NSUM
-- ---------- ----------
A  01.01.2011        300
B  06.01.2011         54

не верный запрос

автор
Нужно получить для каждого ID минимальную дату и соответствующую ей сумму в поле SUM.
2 ноя 11, 15:31    [11540318]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
dumpino
Member

Откуда: Уфа
Сообщений: 100
 with q as
    (
    select 'A' ID, '01.01.2011' dDATE, 300 nSUM from dual union all
    select 'A' ID, '02.01.2011' dDATE, 400 nSUM from dual union all
    select 'A' ID, '03.01.2011' dDATE, 200 nSUM from dual union all
    select 'B' ID, '06.01.2011' dDATE, 554 nSUM from dual union all
    select 'B' ID, '07.01.2011' dDATE, 445 nSUM from dual union all
    select 'B' ID, '09.01.2011' dDATE, 778 nSUM from dual
    )
  select 
    t.id
    , t.mdate
    , t.nsum
  from(
     select 
      id,
      ddate,
      min(dDate) over (partition by id) mdate,
      nSum
      from q ) t
   where t.ddate = t.mdate
2 ноя 11, 15:41    [11540451]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
stax..
Guest
dumpino
автор
Нужно получить для каждого ID минимальную дату и соответствующую ей сумму в поле SUM.




with q as
    (
    select 'A' ID, '01.01.2011' dDATE, 300 nSUM from dual union all
    select 'A' ID, '02.01.2011' dDATE, 400 nSUM from dual union all
    select 'A' ID, '03.01.2011' dDATE, 200 nSUM from dual union all
    select 'B' ID, '06.01.2010' dDATE, 554 nSUM from dual union all
    select 'B' ID, '01.01.2011' dDATE, 445 nSUM from dual union all
    select 'B' ID, '09.01.2011' dDATE, 778 nSUM from dual
    )
  select
    t.id
    , t.mdate
    , t.nsum
  from(
     select
      id,
      ddate,
      min(dDate) over (partition by id) mdate,
      nSum
      from q ) t
   where t.ddate = t.mdate
/
SQL> /

I MDATE            NSUM
- ---------- ----------
A 01.01.2011        300
B 01.01.2011        445

....
stax
2 ноя 11, 15:53    [11540570]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
Моржовый
Guest
dubino
не_верный запрос

В чем заключается неверность?
2 ноя 11, 15:54    [11540576]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
dumpino
Member

Откуда: Уфа
Сообщений: 100
with q as
    (
    select 'A' ID, '01.01.2011' dDATE, 300 nSUM from dual union all
    select 'A' ID, '02.01.2011' dDATE, 400 nSUM from dual union all
    select 'A' ID, '03.01.2011' dDATE, 200 nSUM from dual union all
    select 'B' ID, '06.01.2010' dDATE, 554 nSUM from dual union all
    select 'B' ID, '01.01.2011' dDATE, 445 nSUM from dual union all
    select 'B' ID, '09.01.2011' dDATE, 778 nSUM from dual
    )
 

ога, на этой строчке у вас результат будет не верным
2 ноя 11, 15:59    [11540619]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
AmKad
Member

Откуда:
Сообщений: 5222
dumpino
ога, на этой строчке у вас результат будет не верным

Ты путаешь теплое с мягким: работу запроса и представление входных данных.
2 ноя 11, 16:05    [11540679]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
stax..
Guest
Моржовый
dubino
не_верный запрос

В чем заключается неверность?

1) to_date(...

2) Вопрос скорее к автору, что делать если строк с мин датой не одна?

.....
stax
2 ноя 11, 16:07    [11540706]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
ora78
Guest
stax..
1) to_date(...

абсолютно правильно
2) Вопрос скорее к автору, что делать если строк с мин датой не одна?

судя по примеру автору подходит вариант предложенный dumpino (правда в примере отбор по макс дате)

SQL> with q as
  2      (
  3      select 'A' ID, to_date('01.01.2011') dDATE, 300 nSUM from dual union all
  4      select 'A' ID, to_date('02.01.2011') dDATE, 400 nSUM from dual union all
  5      select 'A' ID, to_date('03.01.2011') dDATE, 200 nSUM from dual union all
  6      select 'B' ID, to_date('06.01.2011') dDATE, 554 nSUM from dual union all
  7      select 'B' ID, to_date('06.01.2011') dDATE, 445 nSUM from dual union all
  8      select 'B' ID, to_date('09.01.2011') dDATE, 778 nSUM from dual
  9      )
 10  select id, ddate, nsum
 11    from (select id,
 12                 dDate,
 13                 nSum,
 14                 dense_rank() over(partition by id order by dDate) rnk
 15            from q)
 16   where rnk = 1;
 
ID DDATE             NSUM
-- ----------- ----------
A  01.01.2011         300
B  06.01.2011         554
B  06.01.2011         445
2 ноя 11, 22:16    [11543032]     Ответить | Цитировать Сообщить модератору
 Re: Отбор записей по минимальной дате  [new]
Добрый Э - Эх
Guest
Основные способы решения поставленной задачи
3 ноя 11, 07:58    [11543815]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить