1

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

ref_year、ref_no、inv_id、start_date、end_date

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

我想为每个引用准确返回一行,这将反映附加到该引用的最早 inv_id ,其中end_date 为 null。这是导致我出现问题的 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为空的情况,在这种情况下,我希望脚本检查取而代之的是该引用的下一个最旧的 inv_id,依此类推,直到它返回一个带有空 end_date 的值。我尝试创建一个只有 null end_dates 的临时表,然后将其作为子查询内部加入,但当然不能,因为该WHERE子句位于子查询之前。有没有一种有效的方法来获得我想要的行为?

4

2 回答 2

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

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

于 2012-06-19T14:21:56.440 回答
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
于 2012-06-19T14:23:34.613 回答