2014-02-11 4 views
0

Мне нужно найти людей, назначенных профилю 99001, но только если они были ранее назначены профилю, заканчивающемуся 0 (но не всеми нулями). Текущий профиль будет иметь эффективную дату, которая соответствует дате истечения предыдущей.Выбор записи путем сравнения столбца с предыдущим

Мой код не возвращает никаких записей:

SELECT p.personnum, 
    ap.name, 
    aa.effectivedtm, 
    aa.expirationdtm 
    FROM vp_employeev42 p, 
    ASSIGNACCRUAL aa, 
    ACCRUALPROFILE ap 
    WHERE p.personid=aa.employeeid 
    and aa.ACCRUALPROFILEID= ap.ACCRUALPROFILEID 
    and p.employmentstatus = 'Active' 
    and p.ACCRUALPRFLNAME = '99001' 
    and ap.name = '99001' 
    and aa.EFFECTIVEDTM = (
    select t2.expirationdtm from assignaccrual t2 
    where t2.employeeid = p.personid 
    and t2.accrualprofileid = ap.ACCRUALPROFILEID 
    and ap.NAME like '%0' 
    and ap.name != '00000') 
    order by p.PERSONNUM, aa.EFFECTIVEDTM 

Любая помощь будет большим.

ASSIGNACCRUAL-Sample

EMPLOYEEID ACCRUALPROFILEID EFFECTIVEDTM EXPIRATIONDTM UPDATEDBYUSRACCTID UPDATEDTM VERSIONCNT 
3778 33482 1 1-Jan-53 1-Jan-00 -1 26-Mar-11 1 
3779 33483 1 1-Jan-53 1-Jan-00 -1 26-Mar-11 1 
403019 34285 1 1-Jan-53 1-Jan-14 -10 29-Dec-13 1 
3781 33485 1 1-Jan-53 1-Jan-00 -1 26-Mar-11 1 
3782 33486 1 1-Jan-53 1-Jan-00 -1 26-Mar-11 1 
3783 33487 1 1-Jan-53 1-Jan-00 -1 26-Mar-11 1 
3784 33488 1 1-Jan-53 1-Jan-00 -1 26-Mar-11 1 
3785 33489 1 1-Jan-53 1-Jan-00 -1 26-Mar-11 1 
3788 33492 1 1-Jan-53 1-Jan-00 -1 26-Mar-11 1 
403021 65065 1 1-Jan-53 1-Jan-14 -10 29-Dec-13 1 
3790 33494 1 1-Jan-53 1-Jan-00 -1 26-Mar-11 1 
3792 33496 1 1-Jan-53 1-Jan-00 -1 26-Mar-11 1 
403023 39566 1 1-Jan-53 1-Jan-14 -10 29-Dec-13 1 

ACCRUALPROFILE-Sample

ACCRUALCODEID ADVANCEDSW NAME VERSION 
    1  0 Default 9 
    202  0 4040 1 
    203  0 4042 3 
    2  0 0 3 
    3  0 1010 10 
    4  0 1011 5 
    5  0 1012 3 
    6  0 2000 4 
    7  0 2001 3 
    8  0 2010 4 

Если удалить последние 2 отборочные это то, что я хотел бы видеть.

1004719 Default 01-JAN-53 01-JAN-14 
1004719 01010 01-JAN-14 28-JAN-14 
1004719 99001 28-JAN-14 01-JAN-00 
1005256 Default 01-JAN-53 01-JAN-14 
1005256 02010 01-JAN-14 01-FEB-14 
1005256 99001 01-FEB-14 01-JAN-00 
1008323 Default 01-JAN-53 01-JAN-14 
1008323 01010 01-JAN-14 07-FEB-14 
1008323 99001 07-FEB-14 01-JAN-00 
1014598 Default 01-JAN-53 01-JAN-14 
1014598 02010 01-JAN-14 28-JAN-14 
1014598 99001 28-JAN-14 01-JAN-00 
1024852 Default 01-JAN-53 01-JAN-14 
1024852 01010 01-JAN-14 28-JAN-14 
+1

взять взгляд на аналитические функции. Вы не публикуете достаточную информацию, такую ​​как схемы таблиц и образцы данных, поэтому не знаете, какую помощь вы получите без нее. – OldProgrammer

+0

Как @OldProgrammer говорит - аналитические функции, попробуйте подключиться по уровню или около того. –

+0

Я действительно не очень разбираюсь в Oracle. Я могу найти простые запросы, но это меня смущает. – user3298859

ответ

0

Вы можете использовать функцию lag(), чтобы получить предыдущее название. Вам нужно сделать это в подзапросе, поэтому условия фильтрации where не повлияют на определение предыдущей записи.

Если я правильно понял ваш вопрос, то это должно быть то, что вам нужно (или что-то близкое к нему):

select personnum, name, effectivedtm, expirationdtm 
from (SELECT p.personnum, ap.name, aa.effectivedtm, aa.expirationdtm, 
      p.employementstatus, p.ACCRUALPRFLNAME, ap.name, 
      lag(ap.name) over (partition by p.personnum order by aa.effectivedtm) as prevname 
     FROM ASSIGNACCRUAL aa join 
      ACCRUALPROFILE ap 
      on aa.ACCRUALPROFILEID = ap.ACCRUALPROFILEID join 
      vp_employeev42 p 
      on p.personid = aa.employeeid 
    ) t 
where employmentstatus = 'Active' and 
     ACCRUALPRFLNAME = '99001' and 
     name = '99001' and 
     prevname like '%0' and 
     prevname <> '00000' 
order by PERSONNUM, EFFECTIVEDTM; 
Смежные вопросы