Получить последнюю запись для ввода в запрос по SQL - PullRequest
0 голосов
/ 27 марта 2020

У меня есть запрос, чтобы узнать детали записи элемента. Я использовал приведенный ниже запрос для того же -

select * from 
(
Select distinct PAPF.PERSON_NUMBER
         , PAAM.ASSIGNMENT_NUMBER
         , PPNF.FULL_NAME
         , PAAM.ASSIGNMENT_STATUS_TYPE ASSIGNMENT_STATUS
         , PETF.BASE_ELEMENT_NAME ELEMENT_NAME
         , to_char(PEEVF.EFFECTIVE_START_DATE, 'YYYY/MM/DD') ENTRY_START_DATE
         , to_char(PEEVF.EFFECTIVE_END_DATE, 'YYYY/MM/DD') ENTRY_END_DATE
         , PIVF.BASE_NAME INPUT_NAME


      From PER_ALL_PEOPLE_F PAPF
         , PER_PERSON_NAMES_F PPNF
         , PER_PERIODS_OF_SERVICE PPOS
         , PER_ALL_ASSIGNMENTS_M PAAM
         , PAY_PAY_RELATIONSHIPS_DN PPRD
         , PAY_REL_GROUPS_DN PRGD
         , PAY_ELEMENT_TYPES_F PETF
         , PAY_ELEMENT_ENTRIES_F PEEF
         , PAY_ELEMENT_ENTRY_VALUES_F PEEVF
         , PAY_INPUT_VALUES_F PIVF,  PAY_ENTRY_USAGES peu, PAY_PAYROLL_ASSIGNMENTS PPA, FND_LOOKUP_VALUES FLV
     Where 1=1
       And PEEF.ELEMENT_TYPE_ID = PETF.ELEMENT_TYPE_ID

       And PEEVF.ELEMENT_ENTRY_ID = PEEF.ELEMENT_ENTRY_ID

       And PIVF.ELEMENT_TYPE_ID = PEEF.ELEMENT_TYPE_ID
       And PIVF.INPUT_VALUE_ID = PEEVF.INPUT_VALUE_ID
       AND PEEF.ELEMENT_ENTRY_ID = PEU.ELEMENT_ENTRY_ID
       And PPRD.PAYROLL_RELATIONSHIP_ID = PEU.PAYROLL_RELATIONSHIP_ID
       AND FLV.LOOKUP_TYPE = 'PAY_USAGE_LEVEL'
       and flv.lookup_code =  peu.usage_level
       and flv.language = 'US'
       AND PAAM.ASSIGNMENT_ID = PPA.PAYROLL_ASSIGNMENT_ID (+)
       AND PAAM.ASSIGNMENT_ID = PPA.HR_ASSIGNMENT_ID (+)
       And PEEF.PERSON_ID = PAPF.PERSON_ID
       And PPNF.PERSON_ID = PAPF.PERSON_ID
       And PPNF.NAME_TYPE = 'GLOBAL'
       And PPOS.PERSON_ID = PAPF.PERSON_ID
       And PAAM.PERSON_ID = PAPF.PERSON_ID
       And PAAM.PERIOD_OF_SERVICE_ID = PPOS.PERIOD_OF_SERVICE_ID
       And PAAM.ASSIGNMENT_TYPE In ('E', 'C')
       And PAAM.EFFECTIVE_LATEST_CHANGE = 'Y'
       And PAAM.ASSIGNMENT_STATUS_TYPE In ('ACTIVE', 'SUSPENDED')
       And PPRD.PERSON_ID = PAPF.PERSON_ID
       And PRGD.PAYROLL_RELATIONSHIP_ID = PPRD.PAYROLL_RELATIONSHIP_ID
       And PRGD.ASSIGNMENT_ID = PAAM.ASSIGNMENT_ID
       And PRGD.GROUP_TYPE = 'A'
       And sysdate Between PIVF.EFFECTIVE_START_DATE AND PIVF.EFFECTIVE_END_DATE
       And sysdate  Between PPNF.EFFECTIVE_START_DATE AND PPNF.EFFECTIVE_END_DATE
       And sysdate  Between PETF.EFFECTIVE_START_DATE AND PETF.EFFECTIVE_END_DATE
       AND sysdate  Between PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE
       And sysdate Between PAAM.EFFECTIVE_START_DATE AND PAAM.EFFECTIVE_END_DATE
       --And sysdate  Between PEEVF.EFFECTIVE_START_DATE AND --PEEVF.EFFECTIVE_END_DATE
       and PETF.BASE_ELEMENT_NAME = 'Bonus Production'

)

Вывод, который я получаю, правильный,

S.No.  PERSON_NUMBER   ASSIGNMENT_NUMBER      FULL_NAME   ASSIGNMENT_STATUS    ELEMENT_NAME       ENTRY_START_DATE    ENTRY_END_DATE        INPUT_NAME

1     101               E101-2                   XYZ          ACTIVE            Bonus Production    2020/02/03           2020/02/16            amount
2     101               E101-2                   XYZ          ACTIVE            Bonus Production    2020/03/04           2020/03/16            Percentage
3     102               E102-2                   RFC          ACTIVE            Bonus Production    2020/02/03           4712/12/31            amount

Теперь мне нужна только последняя запись для сотрудника , если я добавлю условие sysdate Between PEEVF.EFFECTIVE_START_DATE AND PEEVF.EFFECTIVE_END_DATE, я не получу # 1,2. Но мне нужно # 2 в выводе, так как это последняя запись для этого сотрудника.

Какое условие я могу добавить в этот запрос для получения последней записи?

1 Ответ

0 голосов
/ 27 марта 2020

Я бы предложил использовать здесь аналитические функции, чтобы определить максимальную дату окончания записи для человека, а затем выбрать только ту запись, которая соответствует этой цифре. Поэтому добавьте следующее к своему внутреннему оператору выбора:

max(peevf.effective_end_date) OVER (PARTITION BY papf.person_number) AS MAX_ENTRY

А затем к своему внешнему оператору выбора добавьте следующее предложение WHERE:

WHERE ENTRY_END_DATE = MAX_ENTRY

Вы можете прочитать больше об аналитических функциях здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...