powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle Sql
25 сообщений из 33, страница 1 из 2
Oracle Sql
    #39857096
AckermanMika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. У меня есть код, где 'D' и 'S' статус отказанных и аппрувнутых соответственно заявок в банке. Помимо них, есть еще и другие статусы как 'H','F','K' и так далее. В моем коде я вытащил количество уникальных клиентов в разрезе 6 месяцев. Уникальный подразумевает:клиенты которые имели несколько кредитов(например 2 отказанных кредита и 3 аппрувнутых). Получается я вытащил количество таких клиентов в разрезе 6 месяцев.
Мне теперь нужно в разрезе этих 6 месяцев вытащить количество первых кредитов. Например за 6 месяцев у клиента есть 12 по 2 кредита за один месяц, первый кредит аппрувнутый и второй отказанный. Мне нужно вытащить просто первый кредит в не зависимости от статуса кредита. И посчитать общее количество первых кредитов в разрезе 6 месяцев, используя эти данные

select p.Name_credit_status, trunc(t.dtime_Decision,'mm'),count(distinct t.skp_client)
from owner_dwh.dc_Credit_case t
join owner_dwh.cl_credit_status p
ON
t.skp_credit_status=p.SKP_CREDIT_STATUS
where p.code_credit_status in ('D', 'S') and dtime_decision>add_months(sysdate,-6)
Group by p.name_credit_status,trunc(t.dtime_decision,'mm)
...
Рейтинг: 0 / 0
Oracle Sql
    #39857117
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас нет ваших таблиц.

Предоставьте входные данные в виде with, желаемый результат.

Пользуйтесь тегами для удобства чтения.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
select p.Name_credit_status, trunc(t.dtime_Decision,'mm'),count(distinct t.skp_client)
  from owner_dwh.dc_Credit_case t
  join owner_dwh.cl_credit_status p
  ON
  t.skp_credit_status=p.SKP_CREDIT_STATUS
 where p.code_credit_status in ('D', 'S') and dtime_decision>add_months(sysdate,-6)
 Group by p.name_credit_status,trunc(t.dtime_decision,'mm) 
...
Рейтинг: 0 / 0
Oracle Sql
    #39857132
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdmУ нас нет ваших таблиц.

Не вводите в заблуждение, есть у нас его таблицы.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select p.Name_credit_status, trunc(t.dtime_Decision,'mm'),count(distinct t.skp_client)
  from owner_dwh.dc_Credit_case t
  join owner_dwh.cl_credit_status p
  ON
  t.skp_credit_status=p.SKP_CREDIT_STATUS
 where p.code_credit_status in ('D', 'S') and dtime_decision>add_months(sysdate,-6)
 and not exists (select 1 from owner_dwh.dc_Credit_case t2 
                  where t.skp_client = t2.skp_client 
                    and to_char(t.dtime_Decision,'yyyymm') = to_char(t2.dtime_Decision,'yyyymm')
                    and t.dtime_Decision > t2.dtime_Decision)
 Group by p.name_credit_status,trunc(t.dtime_decision,'mm) 
...
Рейтинг: 0 / 0
Oracle Sql
    #39857314
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AckermanMika,

в каком случае к-во первых кредитов в разрезе 6 месяцев не совпадет с count(distinct t.skp_client)?

.....
stax
...
Рейтинг: 0 / 0
Oracle Sql
    #39857669
AckermanMika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

нет такого случая. Просто в разрезе 6 месяцев он должен посчитать количество первых кредитов.
...
Рейтинг: 0 / 0
Oracle Sql
    #39857672
AckermanMika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AckermanMika,
Входные данные
Name_Credit_status (статус кредита)-approved,rejected и так далее
Date_decision (дата согласования кредита)
skp_client (id клиента).
Таблицы : owner_dwh.dc_credit_case
owner_dwh.cl_credit_status (Где хранится Name_credit_status)-справочник.
Нужно взять количество первых кредитов по месяцам за последние пол года уникальных клиентов. Уникальные клиенты подразумевают, клиенты у которых несколько кредитов (с разными статусами).
...
Рейтинг: 0 / 0
Oracle Sql
    #39857692
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AckermanMikaStax,

нет такого случая. Просто в разрезе 6 месяцев он должен посчитать количество первых кредитов.
ничего не понял
к-во первых кредитов, равно к-ву клиентов

приведите пример напр с тремя клиентамы

.....
stax
...
Рейтинг: 0 / 0
Oracle Sql
    #39857700
AckermanMika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Добрый день. Мой код показывает количество всех клиентов со статусами 'D','S','A', 'T', 'K', 'P', 'R', 'L', 'N', 'H', 'Q' и так далее в разрезе полу года по месяцам. Мне нужно вытащить количество клиентов с первыми кредитами за месяц в разрезе полу года.
Смотрите: У одного клиента за первый месяц 3 кредита с разными статусами, мне нужно за этот месяц вытащить только первый кредит(вне зависимости от его статуса). Продолжим: за второй месяц у него 5 кредитов, также со второго месяца нужно вытащить первый кредит. И так нужно посчитать в разрезе полу года. Надо учесть, то что надо только первый кредит с каждого месяца и сгруппировать по месяцам в разрезе 6 месяца.

авторselect p.NAME_CREDIT_STATUS, to_char(t.dtime_decision,'Mon') as mon,extract(year from t.dtime_decision) as yyyy,count(distinct t.skp_client)
from OWNER_DWH.DC_CREDIT_CASE t
join owner_dwh.cl_credit_status p
ON t.SKP_CREDIT_STATUS=p.SKP_CREDIT_STATUS
where p.Code_credit_status in ('D','S','A', 'T', 'K', 'P', 'R', 'L', 'N', 'H', 'Q') and dtime_decision>add_months(sysdate,-6)
GROUP BY p.NAME_CREDIT_STATUS, to_char(t.dtime_decision,'Mon'),extract(year from t.dtime_decision)
...
Рейтинг: 0 / 0
Oracle Sql
    #39857704
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

В разбивке по статусам, может быть разное кол-во клиентов.

Код: plsql
1.
2.
with q(cl_id, state, mm) as (select 1, 'D', 8 from dual union all
select 1 'S', 8 from dual)



Его запрос вернёт 2 статуса и каунт = 1 для каждой строки.
А ему надо вернуть 1ый статус. В таком случае и дистинкт не нужен.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select p.Name_credit_status, trunc(t.dtime_Decision,'mm'),count(t.skp_client)
  from owner_dwh.dc_Credit_case t
  join owner_dwh.cl_credit_status p
  ON
  t.skp_credit_status=p.SKP_CREDIT_STATUS
 where p.code_credit_status in ('D', 'S') and dtime_decision>add_months(sysdate,-6)
 and not exists (select 1 from owner_dwh.dc_Credit_case t2 
                  where t.skp_client = t2.skp_client 
                    and to_char(t.dtime_Decision,'yyyymm') = to_char(t2.dtime_Decision,'yyyymm')
                    and t.dtime_Decision > t2.dtime_Decision)
 Group by p.name_credit_status,trunc(t.dtime_decision,'mm) 
...
Рейтинг: 0 / 0
Oracle Sql
    #39857707
AckermanMika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo,
Я думал использовать keep(dense_Rank first order by). Но я не знаю по чему отсортировать и как можно использовать его в моей задаче. Мне просто нужно в каждом месяце вытащить первое значение кредита(вне зависимости от статуса), а вы привели только в двух статусах. И после того как вытащу первые значения с каждого месяца и посчитать общее количество первых кредитов.
...
Рейтинг: 0 / 0
Oracle Sql
    #39857708
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooВ таком случае и дистинкт не нужен.В таком случае и подзапрос exists излишество.
...
Рейтинг: 0 / 0
Oracle Sql
    #39857711
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

Но ему же надо исключить остальные записи.
Так что либо экзистом, либо дистинкт + фёрст валуе.
...
Рейтинг: 0 / 0
Oracle Sql
    #39857714
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AckermanMikaStax,
Добрый день. Мой код показывает количество всех клиентов со статусами 'D','S','A', 'T', 'K', 'P', 'R', 'L', 'N', 'H', 'Q' и так далее в разрезе полу года по месяцам. Мне нужно вытащить количество клиентов с первыми кредитами за месяц в разрезе полу года.
Смотрите: У одного клиента за первый месяц 3 кредита с разными статусами, мне нужно за этот месяц вытащить только первый кредит(вне зависимости от его статуса). Продолжим: за второй месяц у него 5 кредитов, также со второго месяца нужно вытащить первый кредит. И так нужно посчитать в разрезе полу года. Надо учесть, то что надо только первый кредит с каждого месяца и сгруппировать по месяцам в разрезе 6 месяца.

авторselect p.NAME_CREDIT_STATUS, to_char(t.dtime_decision,'Mon') as mon,extract(year from t.dtime_decision) as yyyy,count(distinct t.skp_client)
from OWNER_DWH.DC_CREDIT_CASE t
join owner_dwh.cl_credit_status p
ON t.SKP_CREDIT_STATUS=p.SKP_CREDIT_STATUS
where p.Code_credit_status in ('D','S','A', 'T', 'K', 'P', 'R', 'L', 'N', 'H', 'Q') and dtime_decision>add_months(sysdate,-6)
GROUP BY p.NAME_CREDIT_STATUS, to_char(t.dtime_decision,'Mon'),extract(year from t.dtime_decision)

Смотрите: каждый клиент имеет первый кредит, поетому к-во первых кредитов == к-ву клиентов
если для к-ва клиентов и к-ва первых кредитов надо учитывать разные статусы то перенести списки из where в count

....
stax
...
Рейтинг: 0 / 0
Oracle Sql
    #39857717
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooStax,

В разбивке по статусам, может быть разное кол-во клиентов.


аааа понял, он группирует по статусах

авторВ моем коде я вытащил количество уникальных клиентов в разрезе 6 месяцев

утверждение неверно

ведь вытащил в разрезе стутуса и месяца

я код невнімательно глянул

.....
stax
...
Рейтинг: 0 / 0
Oracle Sql
    #39857723
AckermanMika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Первые кредиты уникальных клиентов. Под уникальностью подразумевается клиенты у которых несколько кредитов. Например клиент имеет 10 кредитов в одном банке, но при этом в разное время месяца. И мне нужно вытащить только первые кредиты в моем заданном отрезке времени. Если 5 месяцев, и в каждом месяце по 2 кредита. То в output должно выйти 5. Потому что берет первые значения с каждого месяца.
...
Рейтинг: 0 / 0
Oracle Sql
    #39857734
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AckermanMika,

что получить на етих данных?

Код: 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.
34.
35.
36.
SQL> ed
Wrote file afiedt.buf

  1  with cl_credit_status (client_ref,status,dat) as(
  2  select 1,'D',date '2019-07-01' from dual union all
  3  select 1,'S',date '2019-07-17' from dual union all
  4  select 1,'K',date '2019-07-27' from dual union all
  5  select 2,'D',date '2019-07-15' from dual union all
  6  select 2,'S',date '2019-07-25' from dual union all
  7  select 1,'K',date '2019-08-01' from dual union all
  8  select 1,'S',date '2019-08-02' from dual union all
  9  select 1,'D',date '2019-08-03' from dual union all
 10  select 2,'S',date '2019-08-04' from dual union all
 11  select 2,'S',date '2019-08-05' from dual union all
 12  select 3,'M',date '2019-08-01' from dual union all
 13  select 4,'M',date '2019-09-01' from dual )
 14  --к-во первых кредитов в разрезе месяца
 15  ,tt as (select c.*,count(distinct client_ref) over (partition by trunc(dat,'mm')) cc from cl_credit_status c)
 16  --к-во клиентов в разрезе статуса и месяца + к-во первых кредитов
 17  select status,trunc(dat,'mm') yyyy_mm,count(distinct client_ref),max(cc) first_cred
 18  from tt group by status,trunc(dat,'mm')
 19* order by 2,1
SQL> /

S YYYY_MM  COUNT(DISTINCTCLIENT_REF) FIRST_CRED
- -------- ------------------------- ----------
D 01.07.19                         2          2
K 01.07.19                         1          2
S 01.07.19                         2          2
D 01.08.19                         1          3
K 01.08.19                         1          3
M 01.08.19                         1          3
S 01.08.19                         2          3
M 01.09.19                         1          1

8 rows selected.



.....
stax
...
Рейтинг: 0 / 0
Oracle Sql
    #39857741
AckermanMika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Не совсем так. В output-е должны быть:
Credit status Time Count of first credit by unique client
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .
И там должны быть огромные числа, потому что когда прибавить количество первых клиентов, там точно 1 и 2 значения не выйдут.
...
Рейтинг: 0 / 0
Oracle Sql
    #39857746
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AckermanMika,

на вот етих данных что в результате получить

первый клиэнт имеет шесь кредитов
1 D 01.07.19
1 S 17.07.19
1 K 27.07.19
1 K 01.08.19
1 S 02.08.19
1 D 03.08.19
второй клиент имеет четыре кредита
2 D 15.07.19
2 S 25.07.19
2 S 04.08.19
2 S 05.08.19
третий и четвертый клиент имеют один
3 M 01.08.19
4 M 01.09.19

результат?

....
stax
...
Рейтинг: 0 / 0
Oracle Sql
    #39857758
AckermanMika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Смотрите. У вас в первом клиенте есть 6 кредитов. Но теперь обратите внимание на месяцы, первое 01.07 второе 17.07 третее 27.07. Как видите в одном месяце 3 кредита, но нужно взять только первый от даты 01.07. На втором месяце у этого же клиента есть также 3 кредита от даты 01/02/03.08 но нужно вывести кредит только первый от 01.08.
Получается с месяца 07 выходит 1 кредит с месяца 08 выходит также 1 кредит.output:1+1=2.И так по каждому месяцу нужно посчитать в разрезе 6 месяцев. Потом прибавить все первые кредиты для каждого клиента.
...
Рейтинг: 0 / 0
Oracle Sql
    #39857762
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AckermanMikaStax,
Смотрите.

в результате получить табличку/число (нарисуйте) ?

ps
Ваш селект не соответствует "В моем коде я вытащил количество уникальных клиентов в разрезе 6 месяцев"
.....
stax
...
Рейтинг: 0 / 0
Oracle Sql
    #39857770
AckermanMika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Status Date Count(кол-во первых кредитов для каждого клиента)

Статус кредита Дата по месяцам(не по дням) Числовые значения





Входные данные-Name_credit_status (название статуса такие как Approved,Rejected и так далее)
SKP_CLient (Id client)
Code_credit_status (код статуса такие как 'D' 'R' 'P').
...
Рейтинг: 0 / 0
Oracle Sql
    #39857772
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AckermanMika,

посчітайте вручную для моих данных

пока считаете
Код: 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.
34.
35.
36.
37.
38.
SQL> ed
Wrote file afiedt.buf

  1  with cl_credit_status (client_ref,status,dat) as(
  2  select 1,'D',date '2019-07-01' from dual union all
  3  select 1,'S',date '2019-07-17' from dual union all
  4  select 1,'K',date '2019-07-27' from dual union all
  5  select 2,'D',date '2019-07-15' from dual union all
  6  select 2,'S',date '2019-07-25' from dual union all
  7  select 1,'K',date '2019-08-01' from dual union all
  8  select 1,'S',date '2019-08-02' from dual union all
  9  select 1,'D',date '2019-08-03' from dual union all
 10  select 2,'S',date '2019-08-04' from dual union all
 11  select 2,'S',date '2019-08-05' from dual union all
 12  select 3,'M',date '2019-08-01' from dual union all
 13  select 4,'M',date '2019-09-01' from dual )
 14  --первыq кредит = 1 в разрезе месяца,клиэнта
 15  ,tt as (select c.*,lag(0,1,1) over (partition by trunc(dat,'mm'),client_ref order by dat ) f from cl_credit_status c)
 16  --к-во клиентов в разрезе статуса и месяца + к-во первых кредитов
 17  select status,trunc(dat,'mm') yyyy_mm,count(distinct client_ref)
 18  ,sum(sum(f)) over (partition by trunc(dat,'mm')) first_cred_mm
 19  ,sum(sum(f)) over () first_cred_all
 20  from tt group by status,trunc(dat,'mm')
 21* order by 2,1
SQL> /

S YYYY_MM  COUNT(DISTINCTCLIENT_REF) FIRST_CRED_MM FIRST_CRED_ALL
- -------- ------------------------- ------------- --------------
D 01.07.19                         2             2              6
K 01.07.19                         1             2              6
S 01.07.19                         2             2              6
D 01.08.19                         1             3              6
K 01.08.19                         1             3              6
M 01.08.19                         1             3              6
S 01.08.19                         2             3              6
M 01.09.19                         1             1              6

8 rows selected.



какое еще к-во надо?
.....
stax
...
Рейтинг: 0 / 0
Oracle Sql
    #39857779
AckermanMika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax, За основу возьмите мой код. Его нужно просто доработать. Попытаюсь объяснить более понятнее. В одном месяце есть 1000 клиентов и 2000 заявок. Если у каждого клиента по 2 кредита(условно). В этом коде по моему примеру выйдет output=2000. А я хочу, чтобы в output=1000, но разбить по статусам reject=400 approved=600. Потому что должно считаться только первые кредиты, а остальные не берутся в счет. Соответственно количество первых кредитов = количество клиентов. Код нужно доработать и использовать keep dense_Rank first или что то такое.


select p.Name_credit_status, trunc(t.dtime_Decision,'mm'),count(distinct t.skp_client)
from owner_dwh.dc_Credit_case t
join owner_dwh.cl_credit_status p
ON
t.skp_credit_status=p.SKP_CREDIT_STATUS
where p.code_credit_status in ('D', 'S') and dtime_decision>add_months(sysdate,-6)
Group by p.name_credit_status,trunc(t.dtime_Decision,'mm')
...
Рейтинг: 0 / 0
Oracle Sql
    #39857796
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AckermanMikaStax, За основу возьмите мой код.



отвлечемся от тысяч, посчитать вручну сложно и долга

у нас всего
4 клієнта
12 кредитов
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 cl_credit_status (client_ref,status,dat) as(
  2  select 1,'D',date '2019-07-01' from dual union all
  3  select 1,'S',date '2019-07-17' from dual union all
  4  select 1,'K',date '2019-07-27' from dual union all
  5  select 2,'D',date '2019-07-15' from dual union all
  6  select 2,'S',date '2019-07-25' from dual union all
  7  select 1,'K',date '2019-08-01' from dual union all
  8  select 1,'S',date '2019-08-02' from dual union all
  9  select 1,'D',date '2019-08-03' from dual union all
 10  select 2,'S',date '2019-08-04' from dual union all
 11  select 2,'S',date '2019-08-05' from dual union all
 12  select 3,'M',date '2019-08-01' from dual union all
 13  select 4,'M',date '2019-09-01' from dual )
 14  select status,trunc(dat,'mm'),count(distinct client_ref)
 15  from
 16  cl_credit_status
 17  where status in ('D', 'S') --and dtime_decision>add_months(sysdate,-6)
 18* Group by status,trunc(dat,'mm')
SQL> /


S TRUNC(DA COUNT(DISTINCTCLIENT_REF)
- -------- -------------------------
D 01.08.19                         1
D 01.07.19                         2
S 01.07.19                         2
S 01.08.19                         2



дорисуйте недостающие колонки с "Числовыми значениями"

.....
stax
...
Рейтинг: 0 / 0
Oracle Sql
    #39857800
sharkoff76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AckermanMika,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select count(distinct skp_client), dm
  from (select t.skp_client,
               --dtime_Decision,
               case
                 when row_number()
                  over(partition by skp_client order by dtime_Decision) = 1 then
                  trunc(dtime_Decision, 'mm')
                 else
                  null
               end dm --месяц когда открыли открыли 1 ый кредит
          from owner_dwh.dc_Credit_case t
          join owner_dwh.cl_credit_status p 
          on t.skp_credit_status = p.SKP_CREDIT_STATUS
         where p.code_credit_status in ('D', 'S')
           and dtime_decision > add_months(sysdate, -6))
 group by dm
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle Sql
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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