powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Комрады, нужна помощь с запросом
25 сообщений из 25, страница 1 из 1
Комрады, нужна помощь с запросом
    #39730495
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем времени суток!
Прилетела тут мне в вентилятор задача...
В течении месяца клиенты совершали операции, о чем свидетельствуют записи в БД.
Необходимо: внутри каждого дня отобрать операции, где для одного клиента было больше 5 операций, причем нужно выбрать не все записи, а только те, которые > 5...
В какую сторону копать?
Запрос вида
Код: plsql
1.
select trunc(date), count(id) from table group by trunc(date) having count(id) > 5


не поможет - нужны все поля.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730500
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GroMoZeKazzzпричем нужно выбрать не все записи, а только те, которые > 5...

Если у клиента 7 операций, то вернуть только 2?
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730504
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo, да. Критерий - операции с максимальными id.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730518
mama.said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GroMoZeKazzz,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with dt as (
  select to_date('09/10/2018 17:05:00', 'dd/mm/yyyy hh24:mi:ss') as tm, 8 as id from dual union all
  select to_date('09/10/2018 17:06:00', 'dd/mm/yyyy hh24:mi:ss') as tm, 9 as id from dual union all
  select to_date('09/11/2018 17:51:00', 'dd/mm/yyyy hh24:mi:ss') as tm, 1 as id from dual union all
  select to_date('09/11/2018 17:52:00', 'dd/mm/yyyy hh24:mi:ss') as tm, 2 as id from dual union all
  select to_date('09/11/2018 17:53:00', 'dd/mm/yyyy hh24:mi:ss') as tm, 3 as id from dual union all
  select to_date('09/11/2018 17:54:00', 'dd/mm/yyyy hh24:mi:ss') as tm, 4 as id from dual union all
  select to_date('09/11/2018 17:55:00', 'dd/mm/yyyy hh24:mi:ss') as tm, 5 as id from dual union all
  select to_date('09/11/2018 17:56:00', 'dd/mm/yyyy hh24:mi:ss') as tm, 6 as id from dual union all
  select to_date('09/11/2018 17:57:00', 'dd/mm/yyyy hh24:mi:ss') as tm, 7 as id from dual
)
select * from (
  select row_number() over(partition by trunc(tm) order by id) rn, t.* 
  from dt t
) 
where rn > 5  
  
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730520
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GroMoZeKazzz,

Код: plsql
1.
2.
3.
4.
5.
6.
select * from
(select trunc(date)
      , id
      , dense_rank() OVER (partition by trunc(date), id order by date) as rn  
   from table) z
where z.rn > 5
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730539
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GroMoZeKazzzНеобходимо: внутри каждого дня отобрать операции, где для одного клиента было больше 5 операций, причем нужно выбрать не все записи, а только те, которые > 5...


Вы выбрали дни где было больше 5-ти операций,
а Вам надо для одного клиента было больше 5 операций

не понятнно что такое "не все записи"
1) все записи клиентов с "больше 5 операций"?
2) 6-ю и больше опецацию?

.....
stax
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730552
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxне понятнно что такое "не все записи"
1) все записи клиентов с "больше 5 операций"?
2) 6-ю и больше опецацию?
.....
stax
Да, если у клиента было 7 операций за день, то необходимо отобрать 6-ю и 7-ю.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730581
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GroMoZeKazzzДа, если у клиента было 7 операций за день, то необходимо отобрать 6-ю и 7-ю.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH X AS (
           SELECT  T.*,
                   DENSE_RANK() OVER(PARTITION BY CLIENT_ID ORDER BY TRANSACTION_DATE) RNK
             FROM  TRANSACTION_TABLE T
          )
SELECT  *
  FROM  X
  WHERE RNK > 5
/



SY.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730590
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, не вышло. У клиента 2 операции, но он попадает в выборку.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730593
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYGroMoZeKazzzДа, если у клиента было 7 операций за день , то необходимо отобрать 6-ю и 7-ю.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH X AS (
           SELECT  T.*,
                   DENSE_RANK() OVER(PARTITION BY CLIENT_ID ORDER BY TRANSACTION_DATE) RNK
             FROM  TRANSACTION_TABLE T
          )
SELECT  *
  FROM  X
  WHERE RNK > 5
/



SY.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730609
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousSYпропущено...


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH X AS (
           SELECT  T.*,
                   DENSE_RANK() OVER(PARTITION BY CLIENT_ID ORDER BY TRANSACTION_DATE) RNK
             FROM  TRANSACTION_TABLE T
          )
SELECT  *
  FROM  X
  WHERE RNK > 5
/



SY.

Упс,

Код: plsql
1.
                   DENSE_RANK() OVER(PARTITION BY CLIENT_ID,TRUNC(TRANSACTION_DATE) ORDER BY TRANSACTION_DATE) RNK



SY.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730611
mama.said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
partition by client_id, trunc(date)



и что будет если 3 и 4 запись имеют одинаковую дату?
вопрос про dense_rank
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730619
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mama.saidи что будет если 3 и 4 запись имеют одинаковую дату?
вопрос про dense_rank

А две транзакции могут иметь то же время?

SY.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730625
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mama.said
Код: plsql
1.
partition by client_id, trunc(date)



и что будет если 3 и 4 запись имеют одинаковую дату?
вопрос про dense_rank
Той, которую схватит раньше, проставит "3", а следующей - "4".
Можно, конечно, в ордер добавить rowid для верности.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730665
mama.said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo,

я про то чтобы заменить dense_rank на row_number

SY.А две транзакции могут иметь то же время?
речь же идет все таки об операциях клиента. например клиент купил за один клик два товара и получил еще скидку на них 15 процентов. это вполне могут быть три операции в одно и тоже время по одному клиенту.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730672
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создал табличку для теста:
create&insert
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create table tst (
ID number,
DOGNUM number,
SUMMA number(18,2),
DATEOPER date
);
commit;

insert into tst values (1, 123, 100, to_date('08.11.2018 12:01:02','dd.mm.yyyy hh24:mi:ss'));
insert into tst values (2, 123, 100, to_date('08.11.2018 12:02:03','dd.mm.yyyy hh24:mi:ss'));
insert into tst values (3, 123, 100, to_date('08.11.2018 12:03:04','dd.mm.yyyy hh24:mi:ss'));
insert into tst values (4, 123, 100, to_date('09.11.2018 12:05:06','dd.mm.yyyy hh24:mi:ss'));
insert into tst values (5, 123, 100, to_date('09.11.2018 12:07:08','dd.mm.yyyy hh24:mi:ss'));
insert into tst values (6, 123, 100, to_date('09.11.2018 12:09:10','dd.mm.yyyy hh24:mi:ss'));
insert into tst values (7, 123, 100, to_date('09.11.2018 12:11:12','dd.mm.yyyy hh24:mi:ss'));
insert into tst values (8, 123, 100, to_date('09.11.2018 12:13:14','dd.mm.yyyy hh24:mi:ss'));
insert into tst values (9, 123, 100, to_date('09.11.2018 12:15:16','dd.mm.yyyy hh24:mi:ss'));
commit;


Выполняю запрос
Код: plsql
1.
SELECT t.*, DENSE_RANK() OVER(PARTITION BY t.DOGNUM ORDER BY t.DATEOPER) RNK FROM tst t


Получаю:
IDDOGNUMSUMMADATEOPERRNK212310008.11.2018 12:02:031312310008.11.2018 12:03:042412310009.11.2018 12:05:063512310009.11.2018 12:07:084612310009.11.2018 12:09:105712310009.11.2018 12:11:126812310009.11.2018 12:13:147912310009.11.2018 12:15:168
За 09.11.2018 по идее должна вернуться одна запись ID = 9 (при SELECT * FROM X WHERE RNK > 5 ), но вернутся 6,7,8.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730673
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoomama.saidвопрос про dense_rank
Той, которую схватит раньше, проставит "3", а следующей - "4".


уверенны?

Код: 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.
  1  with t as (
  2  select 1 id ,date '2018-11-09' dat from dual union all
  3  select 1 id ,date '2018-11-09' dat from dual union all
  4  select 1 id ,date '2018-11-09' dat from dual union all
  5  select 1 id ,date '2018-11-09' dat from dual union all
  6  select 1 id ,date '2018-11-09' dat from dual union all
  7  select 1 id ,date '2018-11-09' dat from dual union all
  8  select 1 id ,date '2018-11-09' dat from dual )
  9  select * from
 10  (select trunc(dat)
 11        , id
 12        , dense_rank() OVER (partition by trunc(dat), id order by dat) as rn
 13     from t) z
 14* --where z.rn > 5
SQL> /

TRUNC(DA         ID         RN
-------- ---------- ----------
09.11.18          1          1
09.11.18          1          1
09.11.18          1          1
09.11.18          1          1
09.11.18          1          1
09.11.18          1          1
09.11.18          1          1

7 rows selected.



.....
stax
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730681
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот табличка для тестов.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730690
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторгде для одного клиента было больше 5 операций
GroMoZeKazzzСоздал табличку для теста:


клиєнт кто в етой табличке?

.....
stax
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730734
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxклиєнт кто в етой табличке?
.....
stax
DOGNUM - он же номер договора.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730741
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GroMoZeKazzzStaxклиєнт кто в етой табличке?
.....
stax
DOGNUM - он же номер договора.

один клиент может иметь несколько договоров

чем не подходит 21729622 ?

....
stax
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730752
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxодин клиент может иметь несколько договоров
чем не подходит 21729622 ?
....
stax
Может, не спорю. Но в данном случае интерес именно в разрезе договоров.
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730766
mama.said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GroMoZeKazzz,

ну так добавь то в свой селект то что советовали

Код: plsql
1.
partition by t.dognum, trunc(t.dateoper)
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730769
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GroMoZeKazzz,

Код: 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.
  1  with t(ID,DOGNUM,SUMMA,DATEOPER) as (
  2  select 1, 123, 100, to_date('08.11.2018 12:01:02','dd.mm.yyyy hh24:mi:ss') from dual union all
  3  select 2, 123, 100, to_date('08.11.2018 12:02:03','dd.mm.yyyy hh24:mi:ss') from dual union all
  4  select 3, 123, 100, to_date('08.11.2018 12:03:04','dd.mm.yyyy hh24:mi:ss') from dual union all
  5  select 4, 123, 100, to_date('09.11.2018 12:05:06','dd.mm.yyyy hh24:mi:ss') from dual union all
  6  select 5, 123, 100, to_date('09.11.2018 12:07:08','dd.mm.yyyy hh24:mi:ss') from dual union all
  7  select 6, 123, 100, to_date('09.11.2018 12:09:10','dd.mm.yyyy hh24:mi:ss') from dual union all
  8  select 7, 123, 100, to_date('09.11.2018 12:11:12','dd.mm.yyyy hh24:mi:ss') from dual union all
  9  select 9, 123, 101, to_date('09.11.2018 12:13:14','dd.mm.yyyy hh24:mi:ss') from dual union all
 10  select 10,123, 102, to_date('09.11.2018 12:13:14','dd.mm.yyyy hh24:mi:ss') from dual union all
 11  select 11,123, 103, to_date('09.11.2018 12:13:14','dd.mm.yyyy hh24:mi:ss') from dual union all
 12  select 12,123, 100, to_date('09.11.2018 12:15:16','dd.mm.yyyy hh24:mi:ss') from dual
 13  )
 14  select * from
 15  (select t.*
 16        , row_number() OVER (partition by dognum,trunc(dateoper) order by dateoper,id) as rn
 17     from t) z
 18* where z.rn > 5
SQL> /

        ID     DOGNUM      SUMMA DATEOPER         RN
---------- ---------- ---------- -------- ----------
        10        123        102 09.11.18          6
        11        123        103 09.11.18          7
        12        123        100 09.11.18          8



ps
или ... partition by trunc(dateoper),dognum ...



.....
stax
...
Рейтинг: 0 / 0
Комрады, нужна помощь с запросом
    #39730786
GroMoZeKazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем + много в карму!
Взлетело!
Благодарю!!!
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Комрады, нужна помощь с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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