在CASE语句中使用先前计算的值

时间:2019-07-25 14:13:32

标签: sql oracle

我目前正在研究该Oracle数据库,以根据许多条件找出不活动的关系。

因此,目前我有一个CASE语句,可以使用上次登录日期来计算“状态”字段。

以下是我要检查的条件。

  1. 最后一次登录日期是6个月内,然后将状态设置为“有效”-我已经这样做了。
  2. 上次登录日期早于6个月,并且如果用户拥有另一个帐户,该帐户的活动状态是根据先前条件计算得出的,则第二个/多个帐户的“状态”也将设置为“活动”。 这是我无法实现的。

我试图再次将结果表选择到FROM子句中,希望可以填充数据。但我不知道该怎么写。

SELECT t1.UserName,
       t1.UserID,
       t1.LastLoginDate,
       t1.status      
  FROM (SELECT UserName,
               UserID,
               LastLoginDate,              
               (CASE
                    WHEN LastLoginDate > ADD_MONTHS ('01-Jul-2019', -6)
                    THEN
                        'Active'
                END)
                   AS status
          FROM User_Mas_Table) t1

以上查询为我提供了以下结果。

UserName    UserID          LastLoginDate   STATUS
----------  ----------  --------------- ------
AAAAAA          1           7/23/2019       Active
AAAAAA          2           7/24/2019       Active
AAAAAA          3           11/7/2018             
CCCCCC          4           7/24/2019       Active
BBBBBB          5           4/30/2019       Active
DDDDDD          6           5/24/2019       Active
EEEEEE          7           7/22/2019       Active
FFFFFF          8           3/14/2019       Active
GGGGGG          9           7/24/2019       Active
GGGGGG          10          5/14/2018             
HHHHHH          11          4/30/2019       Active

我还需要同时填充那些空的。

1 个答案:

答案 0 :(得分:0)

使用窗口功能比较所有个用户帐户的最新登录日期:

select um.*,
       (case when max(lastlogindate) over (partition by username) > add_months(date '2019-07-01', -6)
             then 'Active'
        end) as status
from User_Mas_Table um;

如果您只希望帐户具有lastlogindate时处于“活动”状态,则逻辑为:

select um.*,
       (case when lastlogindate is not null and
                  max(lastlogindate) over (partition by username) > add_months(date '2019-07-01', -6)
             then 'Active'
        end) as status
from User_Mas_Table um;