Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / задачка. извлечь данные по максимальной дате из нескольких таблиц / 9 сообщений из 9, страница 1 из 1
21.01.2022, 22:38
    #40128616
joskii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка. извлечь данные по максимальной дате из нескольких таблиц
Доброго времени суток!
Подскажите пожалуйста, вторые сутки ломаю голову.
Есть таблица doc:
id_doc | id_client | dt_doc
-------------------------------
к нему нужно присоединить по id_client три примерно друг на друга похожие таблицы, допустим first, second, third
id_client | open_dt | code | n_code
----------------------------------------
по следующему условию:
dt_doc >= open_dt всех трех таблиц,
из таблиц first, second, third нужно сделать выборку которая бы вытащила нам id_client по последней дате.

я использую max(open_dt) over (partition by id_client) для каждой таблицы first, second, third, но тогда у меня имеются записи open_dt > dt_doc

Прошу вас, нет, я даже молю вас, помогите!
...
Рейтинг: 0 / 0
21.01.2022, 22:47
    #40128618
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка. извлечь данные по максимальной дате из нескольких таблиц
Vadim Lejnin
памятка:
HOWTO :: Как правильно задавать вопросы

Как мне оформить свое сообщение?

Студентам, желающим помощи


1) Полная постановка задачи (без сокращений)

2) Подготовьте тестовые данные, лучше в виде with

3) Покажите что сделали, что получили, без сокращений. (лучше не в виде screenshot)

4) используйте Тэги, читать код без них неудобно, правильно оформляйте сообщение
...
Рейтинг: 0 / 0
21.01.2022, 23:22
    #40128623
joskii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка. извлечь данные по максимальной дате из нескольких таблиц
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
select doc.id_doc,

       doc..id_client,

       doc..dt_doc

       nvl(nvl(odin.code, dva.code),tri.code) as code,

       nvl(nvl(odin.n_code, dva.n_code),tri.n_code) as n_code

  from doc

  left join (select t.id_client,

                    t.open_dt,

                    t.code,

                    t.n_code

               from (select cif_id,

                            open_dt,

                            code,

                            n_code,

                            max(open_dt) over (partition by cif_id) max_dt

                       from first

                     ) t

              where open_dt = max_dt

            ) odin

    on doc.id_client = odin.id_client

   and doc.dt_doc >= odin.open_dt 

  left join (select t.cif_id,

                    t.open_dt,

                    t.code,

                    t.n_code

               from (select cif_id,

                            open_dt,

                            code,

                            n_code,

                            max(open_dt) over (partition by cif_id) max_dt

                       from second

                     ) t

              where open_dt = max_dt

              ) dva

    on doc.id_client = dva.id_client

   and doc.dt_doc >= dva.open_dt 

  left join (select t.cif_id,

                    t.open_dt,

                    t.code,

                    t.n_code

               from (select cif_id,

                            open_dt,

                            code,

                            n_code,

                            max(open_dt) over (partition by cif_id) max_dt

                       from third

                     ) t

              where open_dt = max_dt

              ) tri

    on doc.id_client = tri.id_client

   and doc.dt_doc >= tri.open_dt    

                       


нахожусь на таком этапе, подскажите пожалуйста в правильном ли направлении я думаю?
...
Рейтинг: 0 / 0
21.01.2022, 23:31
    #40128625
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка. извлечь данные по максимальной дате из нескольких таблиц
joskii
Код: 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.
select doc.id_doc,
       doc..id_client,
       doc..dt_doc
       nvl(nvl(odin.code, dva.code),tri.code) as code,
       nvl(nvl(odin.n_code, dva.n_code),tri.n_code) as n_code
  from doc
  left join (select t.id_client, t.open_dt, t.code, t.n_code
               from (select cif_id, open_dt, code, n_code,
                            max(open_dt) over (partition by cif_id) max_dt
                       from first) t
              where open_dt = max_dt
            ) odin
    on doc.id_client = odin.id_client
   and doc.dt_doc >= odin.open_dt 
  left join (select t.cif_id, t.open_dt, t.code, t.n_code
               from (select cif_id, open_dt, code, n_code,
                            max(open_dt) over (partition by cif_id) max_dt
                       from second) t
              where open_dt = max_dt
              ) dva
    on doc.id_client = dva.id_client
   and doc.dt_doc >= dva.open_dt 
  left join (select t.cif_id, t.open_dt, t.code, t.n_code
               from (select cif_id, open_dt, code, n_code,
                            max(open_dt) over (partition by cif_id) max_dt
                       from third) t
              where open_dt = max_dt
              ) tri
    on doc.id_client = tri.id_client
   and doc.dt_doc >= tri.open_dt    

нахожусь на таком этапе, подскажите пожалуйста в правильном ли направлении я думаю?

Если не жалеете свои глаза, пожалейте наши...
...
Рейтинг: 0 / 0
22.01.2022, 21:25
    #40128715
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка. извлечь данные по максимальной дате из нескольких таблиц
joskii,

какая версия оракля?

ps
lateral/applay

pss


.....
stax
...
Рейтинг: 0 / 0
22.01.2022, 21:55
    #40128718
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка. извлечь данные по максимальной дате из нескольких таблиц
Stax
lateral/applay
Тут не получится отмазаться плохим знанием русского.
...
Рейтинг: 0 / 0
22.01.2022, 22:22
    #40128723
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка. извлечь данные по максимальной дате из нескольких таблиц
Elic,

APPLY

....
stax
...
Рейтинг: 0 / 0
23.01.2022, 00:08
    #40128746
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка. извлечь данные по максимальной дате из нескольких таблиц
joskii,

набрал

Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
with doc (id_doc,id_client,dt_doc) as (
    select 1,10,date '2022-01-05' from dual union all
    select 2,10,date '2022-01-15' from dual union all
    select 3,20,date '2022-01-20' from dual union all
    select 8,20,date '2021-01-15' from dual 
)
,first (id_client,open_dt,code ) as(
    select 10,date '2022-01-01',111 from dual union all
    select 10,date '2022-01-02',112 from dual union all
    select 10,date '2022-01-03',113 from dual union all
    select 10,date '2022-01-13',114 from dual union all
    select 10,date '2022-01-31',115 from dual union all
--
    select 20,date '2022-01-13',211 from dual union all
    select 20,date '2022-01-24',212 from dual union all
    select 20,date '2022-01-27',213 from dual
)
,second (id_client,open_dt,code ) as(
    select 10,date '2022-01-07',2111 from dual union all
    select 10,date '2022-01-08',2112 from dual union all
    select 10,date '2022-01-31',2115 from dual 
)
,third (id_client,open_dt,code ) as(
    select 10,date '2022-01-11',3111 from dual union all
    select 10,date '2022-01-12',3112 from dual union all
    select 10,date '2022-01-13',3113 from dual union all
    select 10,date '2022-01-14',3114 from dual union all
    select 10,date '2022-01-15',3115 from dual union all
--
    select 20,date '2022-01-13',3211 from dual union all
    select 20,date '2022-01-14',3212 from dual union all
    select 20,date '2022-01-15',3213 from dual
)
,d1 as (
  select * from (
   select d.id_doc,d.id_client,d.dt_doc,open_dt o1,code c1
     ,lead(open_dt) over (partition by d.id_doc,d.id_client order by open_dt) l
   from doc d,first f
   where d.id_client=f.id_client(+) and d.dt_doc >= f.open_dt(+)
  ) where l is null
)
,d2 as (
  select * from (
   select d.id_doc,d.id_client,d.dt_doc,o1,c1,open_dt o2,code c2
     ,lead(open_dt) over (partition by d.id_doc,d.id_client order by open_dt) l
   from d1 d,second f
   where d.id_client=f.id_client(+) and d.dt_doc >= f.open_dt(+)
  ) where l is null
)
,d3 as (
  select * from (
   select d.id_doc,d.id_client,d.dt_doc,o1,c1,02,c2,open_dt o3,code c3
     ,lead(open_dt) over (partition by d.id_doc,d.id_client order by open_dt) l
   from d2 d,third f
   where d.id_client=f.id_client(+) and d.dt_doc >= f.open_dt(+)
  ) where l is null
)
select * from d3
order by 1,2



......
stax
...
Рейтинг: 0 / 0
24.01.2022, 19:28
    #40129154
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка. извлечь данные по максимальной дате из нескольких таблиц
Stax,
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
with doc (id_doc,id_client,dt_doc) as (
    select 1,10,date '2022-01-05' from dual union all
    select 2,10,date '2022-01-15' from dual union all
    select 3,20,date '2022-01-20' from dual union all
    select 8,20,date '2021-01-15' from dual 
)
,first (id_client,open_dt,code ) as(
    select 10,date '2022-01-01',111 from dual union all
    select 10,date '2022-01-02',112 from dual union all
    select 10,date '2022-01-03',113 from dual union all
    select 10,date '2022-01-13',114 from dual union all
    select 10,date '2022-01-31',115 from dual union all
--
    select 20,date '2022-01-13',211 from dual union all
    select 20,date '2022-01-24',212 from dual union all
    select 20,date '2022-01-27',213 from dual
)
,second (id_client,open_dt,code ) as(
    select 10,date '2022-01-07',2111 from dual union all
    select 10,date '2022-01-08',2112 from dual union all
    select 10,date '2022-01-31',2115 from dual 
)
,third (id_client,open_dt,code ) as(
    select 10,date '2022-01-11',3111 from dual union all
    select 10,date '2022-01-12',3112 from dual union all
    select 10,date '2022-01-13',3113 from dual union all
    select 10,date '2022-01-14',3114 from dual union all
    select 10,date '2022-01-15',3115 from dual union all
--
    select 20,date '2022-01-13',3211 from dual union all
    select 20,date '2022-01-14',3212 from dual union all
    select 20,date '2022-01-15',3213 from dual
)
select id_doc,id_client, max(dt_doc), max(o1), max(c1), max(o2), max(c2), max(o3), max(c3) from(
select d.*, open_dt o1,code c1, null o2, null c2, null o3, null c3
  from doc d, first d1
  where d.id_client=d1.id_client(+) and d.dt_doc >= d1.open_dt(+)
  union all
select d.*, null, null,  open_dt o2,code c2, null, null
  from doc d, second d2
  where d.id_client=d2.id_client(+) and d.dt_doc >= d2.open_dt(+)
union all
select d.*, null o1,null c1, null o2, null c2, open_dt o3, code c3
  from doc d, third d3
  where d.id_client=d3.id_client(+) and d.dt_doc >= d3.open_dt(+)
  ) group by  id_doc,id_client
order by 1,2



PS: 02 => o2
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / задачка. извлечь данные по максимальной дате из нескольких таблиц / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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