0

我正在尝试对日期范围运行查询,该查询还有另一个表 SECM,上面有历史记录。因此,当我针对 01/02/2019 运行查询时,应从运行查询的日期或任何其他可从 SECM 获得数据但小于运行查询日期的数据中检索 SECM 数据。

SECM 数据

在此处输入图像描述

我正在使用的查询如下。

    SELECT 
SECM.EFF_DATE,
POS.EFF_DATE,
E.ACC_NO,E.ACC_NAME AS ACCOUNT_NAME,POS.ACC_ID AS ACC_ID,
SECM.CURRENCY,SECM.DESCRIPTION,
FROM
ACC E
INNER JOIN HOLDING POS ON POS.ACC_ID = E.ACC_ID
INNER JOIN POS_DETAIL POSDET ON POSDET.POS_ID = POS.POS_ID
LEFT OUTER JOIN (SELECT  ALIAS,DESCRIPTION,CURRENCY,EFF_DATE
                 FROM SMFH SM1 
                 WHERE INSTANCE=4 
                 AND EFF_DATE=(SELECT MAX(EFF_DATE) 
                               FROM SMFH SM2 
                               WHERE SM2.INSTANCE=4 
                               AND SM1.ALIAS=SM2.ALIAS 
                               AND EFF_DATE<='02-Jan-2019'
                              )
                ) SECM ON SECM.ALIAS = POSDET.ALIAS 
                      AND SECM.EFF_DATE <= POS.EFF_DATE
WHERE POS.INSTANCE = 14
AND TRUNC(POS.EFF_DATE) BETWEEN '30-Dec-2018' AND '02-Jan-2019'

当我运行上述查询时,我总是获取 1 月 2 日的数据。下面是电流输出。

在此处输入图像描述

预期产出

在此处输入图像描述

4

1 回答 1

1

按时间顺序编号行,sfmh并将表别名为secm. 对于使用相关子查询和您的条件pos查找最大行数中的每个条目。然后在知道最大行数的情况下secm再次加入:secm

with secm as (
    select row_number() over(order by eff_date) rn, 
           alias, description, currency, eff_date 
      from sfmh)
select pos.eff_date, secm.eff_date, secm.description, secm.currency
  from (
    select pos.*, 
           (select max(rn) from secm 
             where alias = pos.alias and eff_date <= pos.eff_date) rn 
      from pos) pos
  left join secm using(rn)

sfmh当匹配中没有行时需要左连接pos

如果同一别名不可能有两个相同的日期,sfmh那么您可以简化此解决方案:

select pos.eff_date, sfmh.*
  from (
    select pos.*, 
           (select max(eff_date) from sfmh 
             where alias = pos.alias and eff_date <= pos.eff_date) max_ed  
      from pos) pos
  left join sfmh on sfmh.alias = pos.alias and sfmh.eff_date = pos.max_ed

两个查询的dbfiddle 演示

于 2019-12-13T13:14:48.600 回答