Первая дата вступления в силу из таблицы sql - PullRequest
0 голосов
/ 07 октября 2019

Имеется таблица asg_table со столбцамиffective_start_date иffective_end_date.

asg_table :

asg_number     effective_start_date  effective_end_date   location        department        action_code
1                01-jan-2019           20-jan-2019                        HR                 HIRE     
1                21-JAN-2019           18-FEB-2019         Vietnam        HR                 CHANGE_ASG
1                19-FEB-2019           31-DEC-4712         Vietnam        Manegment          CHANGE_ASG
2                02-mar-2019           29-Apr-2019         Peru           hr                  HIRE
2                30-Apr-2019           31-dec-4712         Vietnam        HR                  CHANGE_ASG

Я хочу создать запрос для поиска первой даты эффективного_стартасотрудник, когда код_действия является АРЕНДОМ, а местоположение пустым. Есть ли функция для этого?

Ответы [ 5 ]

0 голосов
/ 07 октября 2019

Зависит от того, в каком порядке вы хотите выполнить фильтрацию:

Настройка Oracle :

CREATE TABLE asg_table ( asg_number, effective_start_date, effective_end_date, location, department, action_code ) AS
SELECT 1, DATE '2019-01-01', DATE '2019-01-20', NULL,      'HR',         'HIRE'       FROM DUAL UNION ALL
SELECT 1, DATE '2019-01-21', DATE '2019-02-18', 'Vietnam', 'HR',         'CHANGE_ASG' FROM DUAL UNION ALL
SELECT 1, DATE '2019-02-19', DATE '4712-12-31', 'Vietnam', 'Management', 'CHANGE_ASG' FROM DUAL UNION ALL
SELECT 2, DATE '2019-03-02', DATE '2019-04-29', 'Peru',    'HR',         'HIRE'       FROM DUAL UNION ALL
SELECT 2, DATE '2019-04-30', DATE '2019-05-01', 'Vietnam', 'HR',         'CHANGE_ASG' FROM DUAL UNION ALL
SELECT 2, DATE '2019-05-01', DATE '2019-06-01', 'Vietnam', 'HR',         'FIRE'       FROM DUAL UNION ALL
SELECT 2, DATE '2019-06-01', DATE '4712-12-31', NULL,      'HR',         'HIRE'       FROM DUAL;

Запрос 1 :

Если вы хотите отфильтровать, где location - это NULL, а action_code - это сначала HIRE, а затем найдите самый ранний effective_start_date для каждого asg_number, затем:

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY asg_number ORDER BY effective_start_date ASC ) rn
  FROM   asg_table t
  WHERE  location    IS NULL
  AND    action_code = 'HIRE'
)
WHERE rn = 1

Вывод :

ASG_NUMBER | EFFECTIVE_START_DATE | EFFECTIVE_END_DATE | LOCATION | DEPARTMENT | ACTION_CODE | RN
---------: | :------------------- | :----------------- | :------- | :--------- | :---------- | -:
         1 | 2019-01-01           | 2019-01-20         | <em>null</em>     | HR         | HIRE        |  1
         2 | 2019-06-01           | 4712-12-31         | <em>null</em>     | HR         | HIRE        |  1

Запрос 2 :

Если вы хотите найти самые ранние effective_start_date для каждогоasg_number, а затем фильтр, где location равен NULL, а action_code равен HIRE, а затем:

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY asg_number ORDER BY effective_start_date ASC ) rn
  FROM   asg_table t
)
WHERE  location    IS NULL
AND    action_code = 'HIRE'
AND    rn = 1

Выход :

ASG_NUMBER | EFFECTIVE_START_DATE | EFFECTIVE_END_DATE | LOCATION | DEPARTMENT | ACTION_CODE | RN
---------: | :------------------- | :----------------- | :------- | :--------- | :---------- | -:
         1 | 2019-01-01           | 2019-01-20         | <em>null</em>     | HR         | HIRE        |  1

дБ <> скрипка здесь

0 голосов
/ 07 октября 2019
SELECT MIN(effective_start_date) OVER(PARTITION BY action_code ORDER BY action_code) AS first_effective_start_date,A.*
FROM asg_table A
WHERE LOCATION  IS NULL
AND action_code ='HIRE'
;

Если вы хотите получить все записи вместе с first_effective_start_date в виде отдельного столбца.

Cheers !!

0 голосов
/ 07 октября 2019

Нет необходимости в функции

SELECT * FROM TABLENAME WHERE EFFECTIVE_START_DATE IN (CASE WHEN ACTION_CODE='HIRE' AND LOCATION IS NULL THEN EFFECTIVE_START_DATE END)

В верхней части вышеупомянутого запроса используйте

ROW_NUMBER ANALYTICAL FUNCTION

, чтобы получить первый

EFFECTIVE_START_DATE
0 голосов
/ 07 октября 2019

Я надеюсь, что есть какой-то столбец для идентификации сотрудника.

Попробуйте:

Select * from
  (Select t.*, 
  Row_number() over 
  (partition by t.employee_id order by t.effective_start_date) as rn
  From asg_table t
  Where t.location is null 
  AND t.action_code = 'HIRE')
Where rn = 1;

Приветствия !!

0 голосов
/ 07 октября 2019
SELECT 
    (SELECT MIN(effective_start_date) FROM asg_table) as first 
FROM 
    asg_table 
WHERE 
    location IS NULL AND action_code = "HIRE" 
LIMIT 1;

Наслаждайтесь!

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