Как написать функцию для получения текущей даты вступления строки в Oracle - PullRequest
0 голосов
/ 27 октября 2018

Мой вопрос идет дальше, чем вопрос в посте ниже: Как получить текущую дату вступления в силу в Oracle?

У меня есть несколько таблиц, подобных примеру в сообщении:

TID  TName  EffectiveDate   
   1    A      2011-7-1    
   2    A      2011-8-1    
   3    A      2011-9-1
   4    A      2011-10-1    
   5    B      2011-8-1    
   6    B      2011-9-1    
   7    B      2011-10-1    
   8    C      2011-9-1    
   etc...

Если сегодня 2011-9-10, я бы хотел, чтобы результат запроса был таким:

TID  TName  EffectiveDate  Status    
   1    A      2011-7-1      Invalid    
   2    A      2011-8-1      Invalid    
   3    A      2011-9-1      Valid    
   4    A      2011-10-1     Inactive    
   5    B      2011-8-1      Invalid    
   6    B      2011-9-1      Valid    
   7    B      2011-10-1     Inactive
   8    C      2011-9-1      Valid

В приведенном выше вопросе было решение, подобное этому:

select TID,
       TName,
       EffectiveDate,
       decode(sign(EffectiveDate - (select max(T2.EffectiveDate) 
                                    from MyTable T2
                                    where T1.Tname=T2.Tname and 
                                          T2.EffectiveDate <= sysdate)),
              -1,'Invalid',
              0,'Valid',
              'Inactive') Status
from MyTable T1

и работает нормально.

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

Я не думаю, что это сложно.

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

В приведенном выше примере вам нужно только взглянуть на TName, чтобы получить текущую дату вступления в силу.

В приведенном ниже примере вы должны взять emplid и empl_rcd вместе

TID EMPLID EMPL_RCD EFFECTIVEDATE
1   001    0       2011-07-01
2   001    0       2011-06-25
3   001    1       2011-07-01
4   002    0       2011-07-01
5   002    0       2011-08-01

Если сегодня 2012-01-01, результат должен быть:

TID EMPLID EMPL_RCD EFFECTIVEDATE STATUS
1   001    0       2011-07-01  valid
2   001    0       2011-06-25  invalid
3   001    1       2011-07-01  valid
4   002    0       2011-07-01  invalid
5   002    0       2011-08-01  valid

Во втором примере мой запрос должен выглядеть так:

select TID,
       TName,
       EffectiveDate,
       decode(sign(EffectiveDate - (select max(T2.EffectiveDate) 
                                    from MyTable T2
                                    where **T1.emplid=T2.emplid and
                                          T1.empl_rcd = T2.empl_rcd and** 
                                          T2.EffectiveDate <= sysdate)),
              -1,'Invalid',
              0,'Valid',
              'Inactive') Status
from MyTable T1

Но я хочу функцию, которую вы можете вызвать, например,

select T1.*,effdt_status(mytable) as status from mytable

, которая возвращает мне статус этой строки.Но, как упомянуто в двух разных примерах, иногда для определения действительной даты нужно сгруппировать больше столбцов.

Может кто-нибудь помочь мне написать эту функцию?

1 Ответ

0 голосов
/ 27 октября 2018

Это то, что вы ищете?

select t.*,
       (case sum(case when tdate <= date '2011-09-10' then 1 else 0 end)  over (partition by tname order by tdate desc)
            when 0 then 'Inactive'
            when 1 then 'Valid'
            else 'Invalid'
        end)
from mytable t;

Это должно присвоить 'Inactive' любой будущей дате, 'Valid' самой последней дате и 'Invalid' прошлым.

Вы также можете выразить это как:

select t.*,
       (case when tdate > date '2011-09-10' then 'Inactive'
             when not exists (select 1
                              from mytable t2
                              where t2.tname = t.tname and 
                                    t2.tdate > t.tdate and 
                                    t2.tdate <= date '2011-09-10'
                             )
             then 'Valid'
             else 'Invalid'
        end)
from mytable t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...