SQL:如何将结果限制为end_date为null的最早的start_date?

时间:2012-06-19 14:12:04

标签: sql oracle10g

我有一个包含以下列的表:

  

ref_year,ref_no,inv_id,start_date,end_date

前两列(ref_year和ref_no)组合在一起形成其他表中的主键,从现在开始我将它们称为“引用”,但在此表中它们可以多次出现。第三个(inv_id)是外键。最后两列表示inv_id附加到引用的日期,并在适当的情况下表示它停止附加到该引用的日期。

我想为每个引用返回一行,这将反映附加到 end_date为空的引用的最早的inv_id。这是导致我出问题的end_date部分。这是我到目前为止所得到的:

SELECT
    t1.*
FROM
    involvements t1
LEFT OUTER JOIN
    involvements t2
    ON
        (t1.ref_year = t2.ref_year
    AND
        t1.ref_no = t2.ref_no
    AND
        t1.start_date < t2.start_date)
WHERE
    t2.ref_year IS NULL
AND
    t2.ref_no IS NULL

这完全选择了最早的start_date的inv_id,但我无法弄清楚如何解释最早的start_date的inv_id的end_date为 null的情况,其中case我希望脚本检查该引用的下一个最旧的inv_id,依此类推,直到它返回一个null end_date。我尝试创建一个只有null end_dates的临时表,然后将其作为子查询内部加入,但当然不能,因为WHERE子句出现在子查询之前。是否有一种有效的方法来达到我想要的行为?

2 个答案:

答案 0 :(得分:3)

我会使用ROW_NUMBER()为每个引用选择最早的记录。

WITH
  sequenced_data
AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY ref_year, ref_no ORDER BY start_date ASC) AS sequence_id,
    *
  FROM
    involvements
  WHERE
    end_date IS NULL
)
SELECT
  *
FROM
  sequenced_data
WHERE
  sequence_id = 1

如果引用没有end_date IS NULL的任何记录,则它不会返回该引用的任何内容。

答案 1 :(得分:0)

尝试这样的事情:

SELECT
    t2.*
FROM
(SELECT
    ref_year, 
    ref_no,
    min(start_date) start_date
FROM
    involvements t1
where
    end_date is null
GROUP BY
    ref_year,
    ref_no
) as subq
INNER JOIN involvements t2 on 
    t2.ref_year - subq.ref_year 
    and t2.ref_no = subq.ref_no 
    and subq.start_date = t2.start_date