具有多个值迭代的SQL查询,例如每个

时间:2013-08-20 18:48:21

标签: sql database oracle join

表:detail1

LN_ID       LN_DATE   LN_CATG
----------  --------  -------
1693834961  8/1/2013        16
1693834961  7/1/2013        16
1693834961  6/1/2013         4
1693834961  5/1/2013        16
1693834962  8/1/2013        16
1693834962  7/1/2013        16
1693834962  6/1/2013        16
1693834962  5/1/2013         5

表:detail2

LN_ID       LN_MOD_DATE  LN_PYMT_DATE
----------  -----------  ------------
1693834961  8/1/2012     1/1/2011
1693834961  9/1/2011     2/1/2011
1693834962  10/1/2012    3/1/2012

结果:

LN_ID      FIRST_DT  LAST_DT   LN_MOD_DT  LN_PYMT_DT
---------- --------  --------  ---------  ----------
1693834961 8/1/2013  6/1/2013  8/1/2012    1/1/2011

查询:

SELECT ln_id, first_dt, last_dt, ln_mod_dt, ln_pymt_dt  FROM 
(SELECT   a.ln_id ln_id, a.ln_date first_dt, 
                 b.ln_date last_dt, c.ln_mod_date ln_mod_dt,
                 c.ln_pymt_date ln_pymt_dt
            FROM detail1 a,
                 (SELECT *
                    FROM (SELECT   *
                              FROM detail1
                             WHERE ln_id = '1693834961'
                               AND ln_catg <> 16
                          ORDER BY ln_date DESC)
                   WHERE ROWNUM < 2) b,
                 (SELECT *
                    FROM (SELECT   *
                              FROM detail2
                             WHERE ln_id  = '1693834961'
                          ORDER BY ln_mod_date DESC)
                   WHERE ROWNUM < 2) c
           WHERE a.ln_id = b.ln_id
             AND a.ln_id = c.ln_id
             AND a.ln_catg = 16
        ORDER BY a.ln_date DESC)
 WHERE ROWNUM < 2

我需要从detail1表中为每个LN_ID连续找到ln_catg = 16的第一个(最新)和最后一个日期。

例如,预期输出为,

   LN_ID      FIRST_DT  LAST_DT   LN_MOD_DT  LN_PYMT_DT
    ---------- --------  --------  ---------  ----------
    1693834961 8/1/2013  7/1/2013  8/1/2012    1/1/2011
    1693834962 8/1/2013  6/1/2013  8/1/2012    1/1/2012
    --------

当查询在某个时间对一个ln_id执行时,这个工作似乎很好,但是我们期望这种查询应该一次针对多个ID执行。

是否可以添加各种各样的或者添加任何其他的或者IN IN Condtion传递不同的iD?因为子查询中的ln_id硬代码不确定如何使用一个和另一个并执行..

任何帮助都会得到解决。

1 个答案:

答案 0 :(得分:0)

我想这会做到吗?

SELECT 
    D1.LN_ID, 
    MAX(D1.LN_DATE) AS FIRST_DT, 
    MAX(D1_A.LN_DATE) AS LAST_DT, 
    MAX(D2.LN_MOD_DATE) AS LN_MOD_DT, 
    MAX(D2.LN_PYMT_DATE) AS LN_PYMT_DT  
FROM 
    DETAIL1 D1
    INNER JOIN DETAIL2 D2 ON D1.LN_ID=D2.LN_ID
    INNER JOIN DETAIL1 D1_A ON D1_A.LN_ID=D1.LN_ID
WHERE 
    D1.LN_CATG = 16 
    AND D1_A.LN_CATG = 16 
    AND D1_A.LN_DATE < D1.LN_DATE
GROUP BY 
    D1.LN_ID