powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вернуть минимальный ID по датам
14 сообщений из 14, страница 1 из 1
Вернуть минимальный ID по датам
    #40072935
lutdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Стоит задачка: Необходимо вернуть все ID с минимальными датами по заказчикам

select v.id , v.customer_id
from orders v
where TRUNC(v.dat) BETWEEN TO_DATE('2021-04-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND TO_DATE('2021-04-30 00:00:00', 'yyyy-mm-dd hh24:mi:ss')

GROUP BY v.dat, v.customer_id
ORDER BY v.dat, v.customer_id


Например таблица:
ID customer_id dat
1 111 01.04.21
2 111 15.04.21
3 222 02.04.21
4 333 12.04.21
5 444 10.04.21
6 444 11.04.21

запрос должен вернуть id запись сортируя по дате и группируя по заказчику:

ID
1
3
4
5
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40072936
lutdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще бывает такая проблема:


ID customer_id dat
1 111 01.04.21
2 111 01.04.21
3 222 02.04.21
4 333 12.04.21
5 444 10.04.21
6 444 11.04.21

запрос должен вернуть:

ID
1
3
4
5
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40072956
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lutdan,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select
    id,
    customer_id,
    dat
from
    (
        select
            id,
            customer_id,
            dat,
            row_number() over (partition by customer_id order by dat, id) rn
        from
            orders
    )
where
    rn = 1;
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40072980
=nomad=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите на конструкцию
Код: plsql
1.
2.
MIN(id) KEEP (DENSE_RANK FIRST ORDER BY dat)
GROUP BY customer_id
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40073319
lutdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо огромное. Еще и новую функцию узнал.
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40073462
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lutdan
и новую функцию узнал.

Это хорошо что узнали.
И как эта функция называется?
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40073475
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так
Код: sql
1.
2.
3.
4.
5.
select customer_id,min(id),min(dat)
from orders 
where dat>=TO_DATE('2021-04-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND dat<TO_DATE('2021-04-30 00:00:00', 'yyyy-mm-dd hh24:mi:ss')+1
group by customer_id
order by 3
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40073502
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanek842
а так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2   select 1 customer_id,10 id, date '2099-12-31' dat from dual
  3   union all
  4   select 1 id,99,date '2000-01-01' dat from dual
  5  )
  6  select customer_id,min(id),min(dat) from t
  7* group by customer_id
SQL> /

CUSTOMER_ID    MIN(ID) MIN(DAT)
----------- ---------- ----------
          1         10 01.01.2000

SQL>



.....
stax
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40073508
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, тот запрос верен при условии что id и dat вместе линейно возрастают. Если же нет то придется так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select customer_id,min(id),dat
from orders  where (customer_id,dat) in (
 select customer_id,min(dat)
 from orders 
 where dat>=TO_DATE('2021-04-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND dat<TO_DATE('2021-04-30 00:00:00', 'yyyy-mm-dd hh24:mi:ss')+1
 group by customer_id)
group by customer_id,dat
order by 3
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40073547
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanek842,
22327228

.....
stax
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40073586
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax, разве что то не так? вот результат 2го запроса с вашими данными
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL>   with t as (
  2     select 1 customer_id,10 id, date '2099-12-31' dat from dual
  3     union all
  4     select 1 id,99,date '2000-01-01' dat from dual
  5    )
  6  select customer_id,min(id),dat
  7  from t  where (customer_id,dat) in (
  8   select customer_id,min(dat)
  9   from t
 10   group by customer_id)
 11  group by customer_id,dat
 12  /

CUSTOMER_ID    MIN(ID) DAT
----------- ---------- -----------
          1         99 01.01.2000
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40073587
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я понял. конечно я не против аналитических конструкций
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40073603
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanek842
я понял. конечно я не против аналитических конструкций

не знаю что оптимальнее с точки зрения нагрузки/реализации "кеер" или "row_number()=1"

если одно/два поля мне "keep" был удобнее

.....
stax
...
Рейтинг: 0 / 0
Вернуть минимальный ID по датам
    #40073618
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
with orders as (
...  )
, grandma_trick as 
    ( select to_number(substr(min(to_char(dat,'yyyymmddhh24miss')||to_char(id,'fm000000000000000')), 15),'000000000000000') id
           , customer_id
           , min(dat) dat
        from orders
       group by customer_id
    )
select * 
 from  grandma_trick
    ;
--------------------------------------------------------    
with orders as (
...  )
, analytic_filter as 
    ( select orders.*
           , lag(null,1,'x') over (partition by customer_id order by dat, id) f
        from orders
    )
select id, customer_id, dat
  from analytic_filter
 where f = 'x'
    ;
--------------------------------------------------------    
with orders as (
...  )
select min(id) keep (dense_rank first order by dat) id
     , customer_id
     , min(dat) dat
  from orders
 group by customer_id
;
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вернуть минимальный ID по датам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]