1

クエリの同じテーブル内の行を比較する必要があります。

テーブルの例を次に示します。

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 に関連付けられたレコードの 1 つに、チェックアウト日が今日の日付より後のレコードがある場合、それらのレコードを返したくありません。チェックアウトフィールドで、すべてのレコードが今日の日付より前にある各 id のレコードを返したいだけです。

4

3 に答える 3

1

この目的には、分析関数が最適なアプローチです。

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

これは、データが文字列ではなく日付値として保存されていることを前提としています (そうでない場合、max は間違った値を返します)。

于 2013-04-29T21:19:18.283 に答える
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 
于 2013-04-29T21:32:09.540 に答える
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);
于 2013-04-29T21:19:38.350 に答える