我有一个包含以下列的表:
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
子句出现在子查询之前。是否有一种有效的方法来达到我想要的行为?
答案 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