SQL-如果没有可用数据,则获取后备值

问题描述 投票:1回答:1

我有一个类似TBL_A的表:

   CLASS_ID  PERIOD_DT   MAX_DT
  -----------------------------------
   358614  2018-09-30  2018-09-30
   358614  2017-09-30  2018-09-30
   358614  2016-09-30  2018-09-30
   358614  2015-09-30  2018-09-30
   358614  2014-09-30  2018-09-30
   358614  2013-09-30  2018-09-30

和TBL_B喜欢:

    CLASS_ID  CLASS_DT   
   ----------------------
    358614  2018-09-30  
    358614  2017-09-30  
    358614  2016-09-30 

我试图在过去六年中使用CLASS_DT获取结果集,并且某些类没有足够的信息。如果日期不可用,我需要使用接近当前期间日期的先前可用数据。所以我的最终结果应该像

预期结果

 PERIOD_DT   FALLBACK_CLASS_DT
-------------------------------
 2018-09-30  2018-09-30 
 2017-09-30  2017-09-30
 2016-09-30  2016-09-30  
 2015-09-30  2016-09-30 // fallback dates, since they are not available
 2014-09-30  2016-09-30
 2013-09-30  2016-09-30          

我正在尝试的查询是:

 SELECT A.PERIOD_DT,
   (SELECT TOP 1 CAST(B.CLASS_DT AS DATE)
    FROM TBL_B AS B
    WHERE B.CLASS_ID = A.CLASS_ID
      AND CAST(B.CLASS_DT AS DATE) <= CAST(A.PERIOD_DT AS DATE) 
      AND CAST(A.PERIOD_DT AS DATE) <= CAST(A.MAX_DT AS DATE)
    ORDER BY B.CLASS_DT DESC) AS FALLBACK_CLASS_DT
FROM TBL_A AS A
WHERE A.CLASS_ID = 358614  
ORDER BY A.PERIOD_DT DESC;

我得到的结果是:

PERIOD_DT   FALLBACK_CLASS_DT
-------------------------------
 2018-09-30  2018-09-30 
 2017-09-30  2017-09-30
 2016-09-30  2016-09-30  
 2015-09-30  NULL
 2014-09-30  NULL
 2013-09-30  NULL 

有人可以让我知道如何得到这个结果吗?

sql sql-server-2008 select where-clause fallback
1个回答
0
投票

一种方法是:

select a.*, coalesce(b.class_dt, bdef.class_dt)
from tbl_a a left join
     tbl_b b
     on b.CLASS_ID = a.CLASS_ID and
        b.class_dt >= a.period_dt and
        b.class_dt <= a.max_dt left join
     (select b.class_id, min(b.period_dt) as class_dt
      from tbl_b
      group by b.class_id
     ) bdef
     on bdef.class_id = a.class_id;

我想您也可以使用outer apply

select a.*, b.class_dt
from tbl_a a left join
     (select top (1) b.*
      from tbl_b b
      where b.CLASS_ID = a.CLASS_ID and
            b.class_dt <= a.max_dt 
      order by b.period_dt desc
     ) b
© www.soinside.com 2019 - 2024. All rights reserved.