powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос SQL
34 сообщений из 34, показаны все 2 страниц
Запрос SQL
    #39628306
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
select x1.agr_no,
       x1.from_dat,
       p.tabn3,
       p.family3 Nume,
       p.name3 Prenume,
       o.name_podr23 name_podr23_actual,
       d.naim_dolj9 naim_dolj9_actual,
       (select (select pd.Name_Podr23
                  from podrs pd
                 where pd.code23 = pt.podr_code23)
          from paths pt
         where pt.person_tabn3 = p.tabn3
           and pt.dat_nazn16 =
               (select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < x.dat_nazn161)) Name_Podr_prec,
       (select (select dj.naim_dolj9
                  from Doljnosts dj
                 where dj.code9 = pt.doljnost_code9)
          from paths pt
         where pt.person_tabn3 = p.tabn3
           and pt.dat_nazn16 =
               (select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < x.dat_nazn161)) Dolj_prec,
       x.dat_nazn161
  from persons p,
       shtats s,
       podrs o,
       doljnosts d,
       (select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
          from paths t
         where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
               to_date('28.02.2018', 'dd.mm.yyyy')
           and t.actual = '0'
         group by t.person_tabn3) x,
       (select a1.from_dat, a1.tabn, a1.agr_no
          from bars2.PS_AGRE_PERSONS a1
         where a1.agr_type = 'TWO'
           and trunc(a1.from_dat) = (select max(trunc(a.from_dat)) from_dat
                                       from PS_AGRE_PERSONS a
                                      where a.agr_type = 'TWO'
                                        and a.tabn = a1.tabn
                                      group by a.tabn)) x1
where p.dat_uvolnen3 is null
   and p.tabn3 = s.person_tabn3
   and s.podr_code23 = o.code23
   and s.doljnost_code9 = d.code9
   and p.tabn3 = x.person_tabn3
   and p.tabn3 = x1.tabn



Но проблема в том что в один день один человек перевелся на 2 разные местоположения работы , но так я тут использую
Код: plsql
1.
max(t.dat_nazn16)

то естественно одна строка теряется , уже голову сломал как можно исправить . Буду признателен за любой хинт.
...
Рейтинг: 0 / 0
Запрос SQL
    #39628308
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Цель : вывести всех информацию о рабочих за определенный месяц ( в данном случае февраль)

-Имя
-Фамилия
-Настоящее место работы
-Настоящяя должность
-Предыдущая место работы
-Предыдущая должность
-Дата изменений
...
Рейтинг: 0 / 0
Запрос SQL
    #39628311
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002,

Код: plsql
1.
ORA-00942: таблица или представление пользователя не существует
...
Рейтинг: 0 / 0
Запрос SQL
    #39628314
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
merch,

Зачем пытаетесь запустить его у себя ? Естественно он вам выдаст что у вас нет таблиц , но у меня они есть .
...
Рейтинг: 0 / 0
Запрос SQL
    #39628317
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002за любой хинт.rank/dense_rank = 1
...
Рейтинг: 0 / 0
Запрос SQL
    #39628324
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Есть такое , спасибо пошел читать .
...
Рейтинг: 0 / 0
Запрос SQL
    #39628326
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002Но проблема в том что в один день один человек перевелся на 2 разные местоположения работы , но так я тут использую
Код: plsql
1.
max(t.dat_nazn16)

то естественно одна строка теряется , уже голову сломал как можно исправить . Буду признателен за любой хинт.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
...
 select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
          from paths t
         where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
               to_date('28.02.2018', 'dd.mm.yyyy')
           and t.actual = '0'
         group by t.person_tabn3, "местоположение работы"
...
...
Рейтинг: 0 / 0
Запрос SQL
    #39628334
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoouser2002Но проблема в том что в один день один человек перевелся на 2 разные местоположения работы , но так я тут использую
Код: plsql
1.
max(t.dat_nazn16)

то естественно одна строка теряется , уже голову сломал как можно исправить . Буду признателен за любой хинт.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
...
 select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
          from paths t
         where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
               to_date('28.02.2018', 'dd.mm.yyyy')
           and t.actual = '0'
         group by t.person_tabn3, "местоположение работы"
...


Немного не понимаю как это должно работать , вручную прописывать место работы ? ТОгда не вариант , там очень много строк .

RANK() неплохой способ но нужно еще как-то внедрить его тут .
...
Рейтинг: 0 / 0
Запрос SQL
    #39628343
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002RANK() неплохой способ но нужно еще как-то внедрить его тут .Потерпи какое-то время. Сейчас Stax придет, покажет тебе несколько примеров.
...
Рейтинг: 0 / 0
Запрос SQL
    #39628346
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RANK() тоже не вариант , уж оченб большое количество строк которые запрос должен проверить . я вот думаю в сторону изменений в этом сегменте :

Код: plsql
1.
2.
3.
4.
select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < x.dat_nazn161)) Name_Podr_prec,
...
Рейтинг: 0 / 0
Запрос SQL
    #39628349
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002Немного не понимаюЛучше сначала понять, что для быстрого получения ответа надо проявить минимальное уважение к отвечающим.

Вместо публикации полотна, где используются 10 таблиц, свести число таблиц до минимума и показать на конкректных данных что есть и что хочется получить.
Хотя, если бы ты это сделал, наверное и вопрос отпал бы сам собой.

Мало у кого есть желание ковыряться в чужих портянках, но и такие извращенцы здесь водятся.
...
Рейтинг: 0 / 0
Запрос SQL
    #39628353
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

Я это все прекрасной понимаю , но в данном случае ( как мне кажется ) лучше предоставить весь запрос для его найлучшего понимания . Вопрос я думаю задан максимально коректно . А на счет уважение , тут вы неправы , уж извините . Я знаю что на это ресурсе сидят очень знающие в этой теме люди .
...
Рейтинг: 0 / 0
Запрос SQL
    #39628357
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002,

Коррелированный скаляр в коррелированном скаляре выглядит как плод больного воображения.
Чтобы понять психопата надо мыслить как психопат.
...
Рейтинг: 0 / 0
Запрос SQL
    #39628361
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop
Лучше сначала понять, что для быстрого получения ответа надо проявить минимальное уважение к отвечающим.

Вместо публикации полотна, где используются 10 таблиц, свести число таблиц до минимума и показать на конкректных данных что есть и что хочется получить.
Хотя, если бы ты это сделал, наверное и вопрос отпал бы сам собой.

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


мой "тонкий" юмор ТС не понял. Спасибо.
...
Рейтинг: 0 / 0
Запрос SQL
    #39628368
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002( как мне кажется )

Есть пословица.
...
Рейтинг: 0 / 0
Запрос SQL
    #39628370
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне кажется мы немного отошли от моего вопроса , спасибо .
...
Рейтинг: 0 / 0
Запрос SQL
    #39628371
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002,

Код: plsql
1.
2.
3.
4.
5.
6.
with q(name, otdel, nazn) as (select 'Иванов', 'Продажники', to_date('01.04.2018','DD.MM.YYYY') from dual union all
select 'Петров', 'Продажники', to_date('02.04.2018','DD.MM.YYYY') from dual union all
select 'Иванов', 'Сварщики', to_date('03.04.2018','DD.MM.YYYY') from dual union all
select 'Иванов', 'Монтажники', to_date('03.04.2018','DD.MM.YYYY') from dual)

Select nazn, name from q where not exists (select * from q q1 where q1.nazn > q.nazn and q.name = q1.name)
...
Рейтинг: 0 / 0
Запрос SQL
    #39628372
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002,

Еще интересно что движет людьми, называющим таблицы persons и doljnosts.
Почему не persons and positions или ljudi и doljnost, если большая любовь к транслиту?

name и naim это все "имя"?
а family это фамилия, а не семья?

Предполагается, что нормальночу человеку понятны эти маразмы?
...
Рейтинг: 0 / 0
Запрос SQL
    #39628391
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo,

Я не имею информацию какие люди,должности там повторяются в один день .

dbms_photoshop,

Даже не хочу отвечать на этот вопрос .
...
Рейтинг: 0 / 0
Запрос SQL
    #39628408
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002RANK() неплохой способ но нужно еще как-то внедрить его тут .
перед внедрением надо еще и понять что хочем/надо получить

прикиньте, что человека перевели несколько раз за месяц, как тогда быть с Вашим max(t.dat_nazn16)?

даж решите Вы задачку по переходу работников (вывернитесь), так ж наверняка проблемка вылезет напр при расчете отпускных/больничных ...
опять же налоги, фонды и тд

зыы
рассмотрите возможность оформить второй перевод как работу по совместительству

зыы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  1  with paths(person_tabn3, dat_nazn16,cex) as (
  2  select 100,date '2018-02-01',5 from dual union all
  3  select 100,date '2018-02-10',6 from dual union all
  4  select 100,date '2018-02-10',36 from dual union all
  5  select 200,date '2018-02-17',5 from dual )
  6  select person_tabn3,dat_nazn16 dat_nazn161,cex from (
  7   select person_tabn3,dat_nazn16,cex
  8    ,rank() over (partition by t.person_tabn3 order by t.dat_nazn16 desc) r
  9            from paths t
 10           where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
 11                 to_date('28.02.2018', 'dd.mm.yyyy')
 12  --           and t.actual = '0'
 13  --         group by t.person_tabn3, "местоположение работы"
 14* ) where r=1
SQL> /

PERSON_TABN3 DAT_NAZN        CEX
------------ -------- ----------
         100 10.02.18          6
         100 10.02.18         36
         200 17.02.18          5


.....
stax
...
Рейтинг: 0 / 0
Запрос SQL
    #39628462
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxприкиньте, что человека перевели несколько раз за месяц, как тогда быть с Вашим max(t.dat_nazn16)?


Если одного человека будут переводить чаще чем один раз за день то проблем не будет .

Staxперед внедрением надо еще и понять что хочем/надо получить


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

Тут:
Код: plsql
1.
2.
3.
4.
5.
select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
          from paths t
         where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
               to_date('28.02.2018', 'dd.mm.yyyy')nd t.actual = '0' 
         group by t.person_tabn3) x,


Я заявляю что в
Код: plsql
1.
x.dat_nazn161

мы будем иметь значения от 01.02.2018-28.02.2018 .

Идем дальше ....

Тут:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select (select pd.Name_Podr23
                  from podrs pd
                 where pd.code23 = pt.podr_code23)
          from paths pt
         where pt.person_tabn3 = p.tabn3
           and pt.dat_nazn16 =
               (select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < x.dat_nazn161)) Name_Podr_prec



И вот тут :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select (select dj.naim_dolj9
                  from Doljnosts dj
                 where dj.code9 = pt.doljnost_code9)
          from paths pt
         where pt.person_tabn3 = p.tabn3
           and pt.dat_nazn16 =
               (select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < x.dat_nazn161)) Dolj_prec



Мы берем тот самый
Код: plsql
1.
max(pt1.dat_nazn16)

и сравниваем с нашим
Код: plsql
1.
 x.dat_nazn161



В конец я получаю необходимые данные но не все , то есть я должен получить 2 строки состоящий из одинаковых значении во всех столбцах , кроме вышеперечисленных Name_Podr_prec и Dolj_prec
...
Рейтинг: 0 / 0
Запрос SQL
    #39628465
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user2002Staxприкиньте, что человека перевели несколько раз за месяц, как тогда быть с Вашим max(t.dat_nazn16)?


Если одного человека будут переводить НЕ чаще чем один раз за день то проблем не будет .
...
Рейтинг: 0 / 0
Запрос SQL
    #39628493
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался , Stax , вам отдельное спасибо , именно ваш способ помог .
...
Рейтинг: 0 / 0
Запрос SQL
    #39628519
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002,

еще раз
1) работника (тн 100) за период between to_date('01.02.2018', 'dd.mm.yyyy') and to_date('28.02.2018', 'dd.mm.yyyy')
переводили два раза напр
05.02.2018 из цеха 5 в 9 и 15.02.2018 с 9 в 12, Вам надо последний перевод?

2) работника (тн 200) за период between to_date('01.02.2018', 'dd.mm.yyyy') and to_date('28.02.2018', 'dd.mm.yyyy')
переводили раз напр
06.02.2018 из цеха 5 в 9 и 20.02.2018 он устроился еще и в 12-й, Вам надо обе даты?

покажите как ето будет выглядить в paths

user2002
В конец я получаю необходимые данные но не все , то есть я должен получить 2 строки состоящий из одинаковых значении во всех столбцах , кроме вышеперечисленных Name_Podr_prec и Dolj_prec

если я правильно понял то

Код: plsql
1.
2.
3.
4.
5.
select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
          from paths t
         where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
               to_date('28.02.2018', 'dd.mm.yyyy')nd t.actual = '0' 
         group by t.person_tabn3) x,


должен вернуть не одну запись, и будет Вам счастье

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

Еще раз ,

Мне нужно

3) Работника (тн100) за период between to_date('01.02.2018', 'dd.mm.yyyy') and to_date('28.02.2018', 'dd.mm.yyyy')
переводили два раза : из цеха А в цех Б, а потом обратно , в один день , мне нужны обе записи .


Не знаю насколько это правильно но я сделал так :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select (select dj.naim_dolj9
                  from Doljnosts dj
                 where dj.code9 = pt.doljnost_code9)
          from paths pt
         where pt.person_tabn3 = p.tabn3
           and pt.dat_nazn16 =
               (select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < t.dat_nazn16)) Dolj_prec,


Внимание на последнюю строку.


Это подСелект , а в главном селекте добавил
Код: plsql
1.
t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and to_date('28.02.2018', 'dd.mm.yyyy')
...
Рейтинг: 0 / 0
Запрос SQL
    #39628571
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002Разобрался , Stax , вам отдельное спасибо , именно ваш способ помог .

вот и отлично

а то я не совсем понимаю как все ето выглядит в paths
с из цеха А в цех Б и обратно с Б в А (как отлечить что не наоборот)

зы
а ведь может быть и тройной перевод с А в Б, из Б в С из С обратно в А

.....
stax
...
Рейтинг: 0 / 0
Запрос SQL
    #39628575
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxuser2002Разобрался , Stax , вам отдельное спасибо , именно ваш способ помог .

вот и отлично

а то я не совсем понимаю как все ето выглядит в paths
с из цеха А в цех Б и обратно с Б в А (как отлечить что не наоборот)

зы
а ведь может быть и тройной перевод с А в Б, из Б в С из С обратно в А

.....
stax

Проверить, что не существует строк с большей датой в этой же выборке?

Код: plsql
1.
2.
3.
4.
5.
6.
with q(name, otdel, nazn) as (select 'Иванов', 'Продажники', to_date('01.04.2018','DD.MM.YYYY') from dual union all
select 'Петров', 'Продажники', to_date('02.04.2018','DD.MM.YYYY') from dual union all
select 'Иванов', 'Сварщики', to_date('03.04.2018','DD.MM.YYYY') from dual union all
select 'Иванов', 'Монтажники', to_date('03.04.2018','DD.MM.YYYY') from dual)

Select nazn, name from q where not exists (select * from q q1 where q1.nazn > q.nazn and q.name = q1.name)
...
Рейтинг: 0 / 0
Запрос SQL
    #39628590
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxuser2002Разобрался , Stax , вам отдельное спасибо , именно ваш способ помог .


с из цеха А в цех Б и обратно с Б в А (как отлечить что не наоборот)
.....
stax

Отлечить довольно легко , я вывожу настоящее и прошлое место работы , я писал во втором посте . А помог мне ваш пример :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 
 1  with paths(person_tabn3, dat_nazn16,cex) as (
  2  select 100,date '2018-02-01',5 from dual union all
  3  select 100,date '2018-02-10',6 from dual union all
  4  select 100,date '2018-02-10',36 from dual union all
  5  select 200,date '2018-02-17',5 from dual )
  6  select person_tabn3,dat_nazn16 dat_nazn161,cex from (
  7   select person_tabn3,dat_nazn16,cex
  8    ,rank() over (partition by t.person_tabn3 order by t.dat_nazn16 desc) r
  9            from paths t
 10           where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
 11                 to_date('28.02.2018', 'dd.mm.yyyy')
 12  --           and t.actual = '0'
 13  --         group by t.person_tabn3, "местоположение работы"
 14* ) where r=1
...
Рейтинг: 0 / 0
Запрос SQL
    #39628619
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user2002Staxпропущено...



с из цеха А в цех Б и обратно с Б в А (как отлечить что не наоборот)
.....
stax

Отлечить довольно легко , я вывожу настоящее и прошлое место работы , я писал во втором посте . А помог мне ваш пример :


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 with paths(person_tabn3, dat_nazn16,cex) as (
 select 100,date '2018-02-01',5 from dual union all
 select 100,date '2018-02-10',6 from dual union all
 select 100,date '2018-02-10',36 from dual union all
 select 200,date '2018-02-17',5 from dual order by 3 desc)
 select person_tabn3,dat_nazn16 dat_nazn161,cex from (
  select person_tabn3,dat_nazn16,cex
   ,rank() over (partition by t.person_tabn3 order by t.dat_nazn16 desc) r
           from paths t
          where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
                to_date('28.02.2018', 'dd.mm.yyyy')
 --           and t.actual = '0'
 --         group by t.person_tabn3, "местоположение работы"
 ) where r=1
...
Рейтинг: 0 / 0
Запрос SQL
    #39628765
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002Staxпропущено...



с из цеха А в цех Б и обратно с Б в А (как отлечить что не наоборот)
.....
stax

Отлечить довольно легко , я вывожу настоящее и прошлое место работы , я писал во втором посте . А помог мне ваш пример :


Уж не знаю как Вы отличаете "настоящее и прошлое" место работы если они произойдут в 1 день?
Я так понимаю что если сотрудник не сменил место работы в течении месяца, он в выборку не попадает?
По Вашим ответам я смог предположить что вместо rank Вам "удобнее" будет использовать row_number() например как-то так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 with paths(person_tabn3, dat_nazn16,cex, doljnost_code9, podr_code23) as (
 select 100,date '2018-01-01',5, 12, 22 from dual union all
 select 100,date '2018-01-02',6, 13, 23 from dual union all
 select 100,date '2018-02-10',36, 14, 24 from dual union all
 select 200,date '2018-02-17',5, 15, 25 from dual order by 3 desc)
 select person_tabn3,dat_nazn16 dat_nazn161,doljnost_code9, podr_code23, r from (
  select person_tabn3,
         dat_nazn16,
         doljnost_code9, 
         podr_code23,
         row_number()    over (partition by t.person_tabn3 order by t.dat_nazn16 desc) r,
         max(dat_nazn16) over (partition by t.person_tabn3 order by t.dat_nazn16 desc) maxDate
           from paths t
          where t.dat_nazn16 <= to_date('28.02.2018', 'dd.mm.yyyy')--between to_date('01.02.2018', 'dd.mm.yyyy') and to_date('28.02.2018', 'dd.mm.yyyy')
 --           and t.actual = '0'
 --         group by t.person_tabn3, "местоположение работы"
 ) where r in (1,2) and maxDate >= to_date('01.02.2018', 'dd.mm.yyyy')


Таким образом Вы в "главном селекте" будете уже иметь максимальный и предыдущий doljnost_code9 и podr_code23 для дальнейшей работы. Этот подход, я надеюсь, Вас сподвигнет переписать свой селект в удобоваримую форму

P.S. пока я читал Ваши поля, у меня кровь пошла из глаз =( это издевательство над обоими языками
...
Рейтинг: 0 / 0
Запрос SQL
    #39628840
user2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Этот код писал не я , я лишь получил задачу исправить его чтоб он работал как надо . Сам долго разбирался .
...
Рейтинг: 0 / 0
Запрос SQL
    #39628843
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

а если три раза переводили, что ж тогда r in (1,2,3)

ps
maxDate всегда >= to_date('01.02.2018', 'dd.mm.yyyy')


.....
stax
...
Рейтинг: 0 / 0
Запрос SQL
    #39629019
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxMaximaXXL,

а если три раза переводили, что ж тогда r in (1,2,3)

ps
maxDate всегда >= to_date('01.02.2018', 'dd.mm.yyyy')


.....
stax

в селекте просто хотят увидеть последнее место с которого перевели, как я это для себя понял

ps
maxDate всегда >= to_date('01.02.2018', 'dd.mm.yyyy') - не всегда, если человека не переводили в этом месяце то его данные не попадут в выборку, как и хотел автор используя t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and to_date('28.02.2018', 'dd.mm.yyyy')
...
Рейтинг: 0 / 0
Запрос SQL
    #39629043
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user2002Цель : вывести всех информацию о рабочих за определенный месяц ( в данном случае февраль)

-Имя
-Фамилия
-Настоящее место работы
-Настоящяя должность
-Предыдущая место работы
-Предыдущая должность
-Дата изменений

И если это действительно цель .... то мой запрос заполняет почти все поля,
для r=1 : -Настоящее место работы, -Настоящяя должность, -Дата изменений
для к=2 : -Предыдущая место работы, -Предыдущая должность
развернуть в 1 строку и дотянуть имя и фамилию - это не есть проблемма

тонкости с: будет ли запись с датой месяца в таблице если человека не переводили, ну тут надо смотреть как данные хранят.
Может и надо будет убрать and maxDate >= to_date('01.02.2018', 'dd.mm.yyyy') но это будет изменение существующего запроса ...
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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