2012-06-19 13 views
1

我有下面的表:SQL:如何将结果限制为那些start_date最早,其中end_date为空的结果?

ref_year,ref_no,inv_id,日期,结束日期

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

我想回到只有一行每个参考将relfect连接到该参考,其中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 

则选择具有完全的最早起始日期的inv_id,但我无法弄清楚如何解释那些情况下与最早起始日期的inv_id有END_DATE这是而不是 null,在这种情况下,我希望脚本检查该引用的下一个最老的inv_id,等等,直到它返回一个空end_date。我尝试创建一个只有null end_dates的临时表,然后内部连接到这个作为子查询,但当然不能,因为WHERE子句出现在子查询之前。有没有一种有效的方式来获得我想要的行为?

回答

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,那么它不会为参考返回任何东西。

+0

感谢您的迅速答复。它在SQL Developer中返回一个936Error,表示在第7行缺少表达式(星号?)。我想不出为什么会这么做,有什么想法? –

+0

@cms_mgr:为了测试它是否真的是'*',将它替换为'ref_year,ref_no,inv_id,start_date,end_date'并且看看会发生什么。 – MatBailie

+0

对不起,我应该想到,我自己,现在完美。谢谢。 –

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