2013-04-29 71 views
1

我需要比较查询的同一个表中的行。比较SQL查询中的行

下面是表的一个例子:

id checkin  checkout  
1  01/15/13 01/31/13 
1  01/31/13 05/20/13 
2  01/15/13 05/20/13 
3  01/15/13 01/19/13 
3  01/19/13 05/20/13 
4  01/15/13 02/22/13 
5  01/15/13 03/01/13 

我结账日期比较今天的日期,如果是今天的日期之前,那么我想返回的结果。但是,类似于ID 1和3,它们有多个记录。如果与同一个id相关联的记录中有一个记录在今天的日期之后有一个结帐日期,那么我不想返回他们的任何记录。我只想返回结帐字段中每个记录在今天日期之前的每个ID的记录。

回答

1

为此,分析功能是最好的办法:

select id, checkin, checkout 
from (select t.*, max(checkout) over (partition by id) as maxco 
     from t 
    ) t 
where maxco <= trunc(sysdate) 

这假定数据存储为日期值而不是字符串(否则,最大将返回错误的值)。

+0

我想用多个表,因为我在一个单独的表中比较结帐日期。我刚刚结束第一次与:从(....)t1,t2? – trueinViso 2013-04-29 21:50:23

+0

@trueinViso。 。 。我想你应该问另一个问题,关于多个表。包括表格格式,示例数据以及所需的结果。这个问题非常清楚地开始“我需要比较查询的同一个表中的行”。 – 2013-04-29 21:52:31

0
select id, checking from 
Table 
where checkout < CURRENT_DATE --Postgresql date of today, Oracle should have an equivalent now 
and id not in (select id from Table where checkout >= CURRENT_DATE); 
0

这应该会给你所有在时间之前的记录的结果,并且所有使用相同ID的记录也都在时间之前。

SELECT Ta.* 
FROM TABLE Ta, 
     (SELECT MAX(checkout) checkout, ID FROM TABLE GROUP BY ID) Tb 
WHERE Ta.ID = Tb.ID 
    AND sysdate >= Ta.checkout -- checks for date in current record 
    AND sysdate >= Tb.checkout -- checks for dates in all records