powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос SQL
9 сообщений из 34, страница 2 из 2
Запрос 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
9 сообщений из 34, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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