Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос с группировкой / 25 сообщений из 25, страница 1 из 1
23.10.2018, 22:57
    #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
23.10.2018, 23:19
    #39721731
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с группировкой
Piastry,

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

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

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

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

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

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

PS: а еще есть аналитические функции.Всё мимо.
...
Рейтинг: 0 / 0
24.10.2018, 07:30
    #39721802
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с группировкой
Piastrygroup by id, paymentPiastryЗадача решена.IQ ниже плинтуса.
...
Рейтинг: 0 / 0
24.10.2018, 09:13
    #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
24.10.2018, 10:02
    #39721860
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с группировкой
Piastry... Необходимо вывести последний платеж по каждому клиенту. ... Как сделать ...

Любым из понравившихся способов
...
Рейтинг: 0 / 0
24.10.2018, 11:05
    #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
24.10.2018, 22:17
    #39722494
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с группировкой
julat21Единственное остается понять как поступать, когда один человек сделал два платежа, какой с них считать последним. Потому как первый выдаст 50 по ROWID первый, второй выдаст 75 как масимальный платеж за день, поэтому если такая ситуация возможна, то необходимо добавлять сортировку после order by dat desc, так как возможно надо брать 60???
Задача подразумевает уникальность id, date, поскольку более одного платежа по одному id в один день делают недостижимым требуемый результат - "Необходимо вывести последний платеж по каждому клиенту."
...
Рейтинг: 0 / 0
24.10.2018, 22:35
    #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
25.10.2018, 07:41
    #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
25.10.2018, 19:23
    #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
25.10.2018, 19:39
    #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
25.10.2018, 19:44
    #39723060
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с группировкой
andrey_anonymousНет.
Зато называется аналитикой))
...
Рейтинг: 0 / 0
25.10.2018, 20:09
    #39723076
SY
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
25.10.2018, 20:18
    #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
25.10.2018, 21:50
    #39723125
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с группировкой
A, не заметил у тебя две версии c KEEP.

SY.
...
Рейтинг: 0 / 0
26.10.2018, 07:27
    #39723234
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с группировкой
SkilledJuniorТак лучше?))Ты самовлюблённый дурак, если не понимаешь, что хуже.
...
Рейтинг: 0 / 0
26.10.2018, 09:59
    #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
26.10.2018, 10:05
    #39723307
ultrasonic7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с группировкой
Хотя ТС, наверно, уже сюда не заглядывает, раз написал, что задача решена.
...
Рейтинг: 0 / 0
26.10.2018, 14:12
    #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
26.10.2018, 14:19
    #39723532
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с группировкой
ElicТы самовлюблённый дурак, если не понимаешь, что хуже.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос с группировкой / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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