db2根据最大日期时间和状态从另一个文件中获取一行

时间:2015-03-20 14:43:01

标签: sql db2

我正在寻找,我又有点迷失了。我能找到的最相关的主题是http://www.tek-tips.com/viewthread.cfm?qid=1173569

所以我想要做的是获取一个select语句,如果id和status匹配,则从另一个表中读取最新的日期和时间。

当我这样做时,我遇到了一些问题。我要么超时,因为查询太大,由于存在多个日期和时间而导致重复的ID,或者我有某种语法错误。

程序员创建了两个逻辑文件供我使用,因为我在历史文件中遇到了很多麻烦。第一个逻辑包含状态为' CLO'的历史记录。第二个逻辑包含状态为' LOA'。

的历史记录

但是当我尝试使用两个逻辑进行内连接时,在日期和时间使用聚合函数max(),它永远不会完成加载。

如果我尝试仅在子选择中获取前1个ROWS,则语法错误,或者我最终得到一行而不是我尝试内连接的表。

为了澄清,最终的结果是我希望两个单独的列连接到我的主表。 CLO'的最大(日期时间)以及' LOA'的最大值(日期时间)。

WANTED COL1就是当前状态= CLO那么最近的日期时间与CLO ELSE NULL

通缉COL2将始终显示,但它也是最近的日期与LOA

╔════════╦════════════════╦═════════════╦═════════════╗  
║ KEY ID ║ CURRENT STATUS ║ WANTED COL1 ║ WANTED COL2 ║  
╠════════╬════════════════╬═════════════╬═════════════╣  
║    111 ║ CLO            ║ 1/1/2015    ║ 12/31/2014  ║  
║    112 ║ LOA            ║ null        ║ 12/31/2014  ║  
║    113 ║ LOA            ║ null        ║ 1/1/2015    ║  
╚════════╩════════════════╩═════════════╩═════════════╝

我拥有的历史档案就是这样。

╔════════╦════════════╦══════╦══════════════╗  
║ KEY ID ║ DATE       ║ TIME ║ STATUS       ║  
╠════════╬════════════╬══════╬══════════════╣  
║ 111    ║ 1/1/2015   ║ 1025 ║ CLO          ║  
║ 111    ║ 12/31/2014 ║ 555  ║ LOA          ║  
║ 111    ║ 12/31/2014 ║ 333  ║ OTHER STATUS ║  
║ 113    ║ 12/31/2014 ║ 333  ║ LOA          ║  
║ 112    ║ 12/31/2014 ║ 333  ║ OTHER STATUS ║   
║ 112    ║ 12/31/2014 ║ 333  ║ LOA          ║   
╚════════╩════════════╩══════╩══════════════╝   

但为我所做的逻辑却让人感到沮丧。

╔════════╦════════════╦══════╦════════╗   
║ KEY ID ║ DATE       ║ TIME ║ STATUS ║   
╠════════╬════════════╬══════╬════════╣   
║ 111    ║ 12/31/2014 ║ 555  ║ LOA    ║   
║ 111    ║ 12/30/2014 ║ 555  ║ LOA    ║   
║ 111    ║ 12/25/2014 ║ 555  ║ LOA    ║   
║ 113    ║ 12/31/2014 ║ 333  ║ LOA    ║   
║ 112    ║ 12/31/2014 ║ 333  ║ LOA    ║   
╚════════╩════════════╩══════╩════════╝   

@ danny117 我尝试了这个查询,但它显示了一个错误。 [SQL0338] JOIN谓词无效。

        WITH cteLOA AS
        (
            SELECT temp_tableLOA.Date || ' ' || temp_tableLOA.Time AS oneDATETIMELOA
            FROM /**/ temp_tableLOA
            ORDER BY oneDATETIMELOA DESC
            FETCH FIRST 1 ROWS ONLY
        ),
        cteCLO AS
        (
            SELECT temp_tableCLO.Date || ' ' || temp_tableCLO.Time AS oneDATETIMECLO
            FROM /**/ temp_tableCLO
            ORDER BY oneDATETIMECLO DESC
            FETCH FIRST 1 ROWS ONLY
        )
            SELECT 
            /*other columns*/
            cteLOA.oneDATETIMELOA AS HISTORYDATETIMELOA,
            CASE WHEN /**/STAT = 'CLO ' THEN cteCLO.oneDATETIMECLO ELSE NULL END AS HISTORYDATETIMECLO

        FROM /**/ vu, cteLOA, cteCLO

        /* Insert other inner joins, where logic, group bys, yada yada */

1 个答案:

答案 0 :(得分:0)

所有列的一行都是低日期和高日期,加上ID就是这样。

with cte as (                             
SELECT * FROM mytable where stat = "CLO" ORDER BY xDATE desc 
fetch first 1   rows only                 
) select * from cte                       
join mytable on cte.id = mytable.id where stat = "OPN" order by            
mytable.xdate                             
fetch first 1 rows only