powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос с группировкой
25 сообщений из 25, страница 1 из 1
Запрос с группировкой
    #39721720
Piastry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица TABLE с полями ID, DATE, PAYMENT c данными:

ID DATE PAYMENT
_ ______ _______
1 17-JUN-18 100
2 18-JUN-18 50
2 19-JUN-18 50
3 20-JUN-18 45
4 21-MAY-18 100
4 22-MAY-18 50


Где ID-идентификатор клиента, DATE - дата платежа, PAYMENT - сумма платежа. Необходимо вывести последний платеж по каждому клиенту. Что бы получилось вот так:

ID DATE PAYMENT
_ ______ _______
1 17-JUN-18 100
2 19-JUN-18 50
3 20-JUN-18 45
4 22-MAY-18 50

Запрос:

select id, max(date), payment
from table
group by id, amount, payment
order by 1

выдает:

ID DATE PAYMENT
_ ______ _______
1 17-JUN-18 100
2 19-JUN-18 50
3 20-JUN-18 45
4 22-MAY-18 50
4 21-MAY-18 100

Как сделать, чтобы по 4-ому клиенту клиенту осталась только одна запись?
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39721731
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Piastry,

Без payment получишь одну запись.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39721734
Piastry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SkilledJuniorPiastry,

Без payment получишь одну запись.

Это я знаю, но только мне нужны данные с payment.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39721738
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Piastry,

Пары уникальных значений ID, DATE получил, дальше по ним нужно получить payment, есть скалярные подзапросы, есть join, есть in, пробуй.

PS: а еще есть аналитические функции.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39721747
Piastry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибочка в запросе:

select id, max(date), payment
from table
group by id, payment
order by 1
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39721769
Piastry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо. Задача решена.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39721801
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorПары уникальных значений ID, DATE получил, дальше по ним нужно получить payment, есть скалярные подзапросы, есть join, есть in, пробуй.

PS: а еще есть аналитические функции.Всё мимо.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39721802
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Piastrygroup by id, paymentPiastryЗадача решена.IQ ниже плинтуса.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39721823
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
Select id, date, payment from table t1
where not exists (select 1 from table t2 where t1.id = t2.id and t2.date > t1.date)
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39721860
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Piastry... Необходимо вывести последний платеж по каждому клиенту. ... Как сделать ...

Любым из понравившихся способов
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39721912
julat21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Piastry,
Код: 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.
with zap(id, dat, payment) as

(
select 1, to_date('17-01-1018', 'dd-mm-yyyy'), 100 from dual
union all
select 2, to_date('18-01-1018', 'dd-mm-yyyy'), 50 from dual
union all
select 2, to_date('19-01-1018', 'dd-mm-yyyy'), 50 from dual
union all
select 3, to_date('20-01-1018', 'dd-mm-yyyy'), 45 from dual
union all
select 4, to_date('21-05-1018', 'dd-mm-yyyy'), 100 from dual
union all
select 4, to_date('22-05-1018', 'dd-mm-yyyy'), 50 from dual
union all
select 4, to_date('22-05-1018', 'dd-mm-yyyy'), 75 from dual
union all
select 4, to_date('22-05-1018', 'dd-mm-yyyy'), 60 from dual
),
zap2(id, dat, payment) as
(select id, dat,   first_value(payment) over (partition by id order by dat desc)  from zap
)

select id, max(dat),payment from zap2
group by id, payment 
order by id



Еще так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with zap(id, dat, payment) as
(
select 1, to_date('17-01-1018', 'dd-mm-yyyy'), 100 from dual
union all
select 2, to_date('18-01-1018', 'dd-mm-yyyy'), 50 from dual
union all
select 2, to_date('19-01-1018', 'dd-mm-yyyy'), 50 from dual
union all
select 3, to_date('20-01-1018', 'dd-mm-yyyy'), 45 from dual
union all
select 4, to_date('21-05-1018', 'dd-mm-yyyy'), 100 from dual
union all
select 4, to_date('22-05-1018', 'dd-mm-yyyy'), 50 from dual
union all
select 4, to_date('22-05-1018', 'dd-mm-yyyy'), 75 from dual
union all
select 4, to_date('22-05-1018', 'dd-mm-yyyy'), 60 from dual
)
select id, max(dat),  max(payment) keep(dense_rank first order by dat desc) from zap 
group by id



Единственное остается понять как поступать, когда один человек сделал два платежа, какой с них считать последним. Потому как первый выдаст 50 по ROWID первый, второй выдаст 75 как масимальный платеж за день, поэтому если такая ситуация возможна, то необходимо добавлять сортировку после order by dat desc, так как возможно надо брать 60???
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39722494
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
julat21Единственное остается понять как поступать, когда один человек сделал два платежа, какой с них считать последним. Потому как первый выдаст 50 по ROWID первый, второй выдаст 75 как масимальный платеж за день, поэтому если такая ситуация возможна, то необходимо добавлять сортировку после order by dat desc, так как возможно надо брать 60???
Задача подразумевает уникальность id, date, поскольку более одного платежа по одному id в один день делают недостижимым требуемый результат - "Необходимо вывести последний платеж по каждому клиенту."
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39722501
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicВсё мимо.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t (id, paydate, payment) as
(
select 1, to_date('17-JUN-2018', 'DD-MON-YYYY'), 100 from dual union all
select 2, to_date('18-JUN-2018', 'DD-MON-YYYY'), 50  from dual union all
select 2, to_date('19-JUN-2018', 'DD-MON-YYYY'), 50  from dual union all
select 3, to_date('20-JUN-2018', 'DD-MON-YYYY'), 45  from dual union all
select 4, to_date('21-MAY-2018', 'DD-MON-YYYY'), 100 from dual union all
select 4, to_date('22-MAY-2018', 'DD-MON-YYYY'), 50  from dual
)



in
Код: plsql
1.
2.
3.
4.
select id, paydate, payment
from t
where (id, paydate) in (select id, max(paydate) from t group by id)
order by id



скалярный подзапрос
Код: plsql
1.
2.
3.
4.
5.
select a.id, a.mpaydate, (select payment from t b where b.id = a.id and b.paydate = a.mpaydate)
from (select id, max(paydate) mpaydate
      from t
      group by id) a
order by id



join
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select b.id, b.paydate, b.payment
from t b,
     (select id, max(paydate) mpaydate
      from t
      group by id) a
where b.id = a.id and b.paydate = a.mpaydate
order by b.id



PS:
Код: plsql
1.
2.
3.
4.
select id, max(paydate), max(payment) KEEP (DENSE_RANK LAST ORDER BY paydate)
from t
group by id
order by id




Что из этого мимо?
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39722588
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorPS: аналитические функцииSkilledJunior
Код: plsql
1.
2.
select id, max(paydate), max(payment) KEEP (DENSE_RANK LAST ORDER BY paydate)
from t

Учись, студент, лучше.
SkilledJuniorЧто из этого мимо?Всё бессмысленностью.
Рекомендую поменьше сидеть перед зеркалом в самолюбовании.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723048
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicУчись, студент, лучше.
Код: plsql
1.
2.
3.
4.
5.
select DISTINCT id,
min(paydate) KEEP (DENSE_RANK LAST ORDER BY paydate) over(PARTITION BY id),
max(payment) KEEP (DENSE_RANK LAST ORDER BY paydate) over(PARTITION BY id)
from t
order by id


Так лучше?))

ElicВсё бессмысленностью.
Marvin?
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723059
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJunior
Код: plsql
1.
2.
3.
select DISTINCT id,
min(paydate) KEEP (DENSE_RANK LAST ORDER BY paydate) over(PARTITION BY id),
...


Так лучше?))

Нет.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723060
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousНет.
Зато называется аналитикой))
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723076
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorЗато называется аналитикой))

Да ну? Пойди покури доку на предмет аналитика и аггрегация:

Aggregate functions return a single result row based on groups of rows.

Analytic functions compute an aggregate value based on a group of rows.

SY.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723080
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

FIRSTIf you omit the OVER clause, then the FIRST and LAST functions are treated as aggregate functions. You can use these functions as analytic functions by specifying the OVER clause. The query_partition_clause is the only part of the OVER clause valid with these functions. If you include the OVER clause but omit the query_partition_clause, then the function is treated as an analytic function, but the window defined for analysis is the entire table.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723125
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A, не заметил у тебя две версии c KEEP.

SY.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723234
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorТак лучше?))Ты самовлюблённый дурак, если не понимаешь, что хуже.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723304
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такой селект устроит тописктартера?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table payments(id number
                      , payment_date date
                      , payment number);
insert into payments values(1, TO_DATE('17.06.2018', 'dd.mm.yyyy'), 100);
insert into payments values(2, TO_DATE('18.06.2018', 'dd.mm.yyyy'), 50);
insert into payments values(2, TO_DATE('19.06.2018', 'dd.mm.yyyy'), 50);
insert into payments values(3, TO_DATE('20.06.2018', 'dd.mm.yyyy'), 45);
insert into payments values(4, TO_DATE('21.05.2018', 'dd.mm.yyyy'), 100);
insert into payments values(4, TO_DATE('22.05.2018', 'dd.mm.yyyy'), 50);


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with maxdates as
(select id, max(payment_date) maxdate
from payments
group by id)
select p.id, p.payment_date, p.payment
from payments p join maxdates md
  on p.id = md.id and p.payment_date = md.maxdate
order by p.id;
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723307
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя ТС, наверно, уже сюда не заглядывает, раз написал, что задача решена.
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723524
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ultrasonic7,

join уже был выше.

Изящного варианта от Доброго Э - Эха еще не было
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select *
  from (
         select t.*, row_number() 
                           over(partition by id 
                                    order by paydate desc) as rn
           from t
       )
where rn = 1
...
Рейтинг: 0 / 0
Запрос с группировкой
    #39723532
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicТы самовлюблённый дурак, если не понимаешь, что хуже.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос с группировкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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