Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вернуть минимальный ID по датам / 14 сообщений из 14, страница 1 из 1
25.05.2021, 22:50
    #40072935
lutdan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
Добрый день.

Стоит задачка: Необходимо вернуть все 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
25.05.2021, 22:54
    #40072936
lutdan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
еще бывает такая проблема:


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
26.05.2021, 01:10
    #40072956
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
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
26.05.2021, 09:08
    #40072980
=nomad=
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
Посмотрите на конструкцию
Код: plsql
1.
2.
MIN(id) KEEP (DENSE_RANK FIRST ORDER BY dat)
GROUP BY customer_id
...
Рейтинг: 0 / 0
26.05.2021, 21:44
    #40073319
lutdan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
Спасибо огромное. Еще и новую функцию узнал.
...
Рейтинг: 0 / 0
27.05.2021, 11:33
    #40073462
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
lutdan
и новую функцию узнал.

Это хорошо что узнали.
И как эта функция называется?
...
Рейтинг: 0 / 0
27.05.2021, 12:37
    #40073475
sanek842
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
а так
Код: 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
27.05.2021, 13:41
    #40073502
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
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
27.05.2021, 13:52
    #40073508
sanek842
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
да, тот запрос верен при условии что 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
27.05.2021, 15:07
    #40073547
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
sanek842,
22327228

.....
stax
...
Рейтинг: 0 / 0
27.05.2021, 16:22
    #40073586
sanek842
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
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
27.05.2021, 16:24
    #40073587
sanek842
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
я понял. конечно я не против аналитических конструкций
...
Рейтинг: 0 / 0
27.05.2021, 17:15
    #40073603
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
sanek842
я понял. конечно я не против аналитических конструкций

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

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

.....
stax
...
Рейтинг: 0 / 0
27.05.2021, 17:42
    #40073618
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть минимальный ID по датам
Код: 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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вернуть минимальный ID по датам / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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