2013-04-29 13 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, у них есть несколько записей. Если одна из записей, связанных с одним и тем же идентификатором, имеет запись, у которой есть дата проверки после сегодняшней даты, я не хочу возвращать какую-либо их запись. Я хочу только вернуть запись каждого идентификатора, где каждая запись находится до сегодняшней даты в поле проверки.

ответ

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

+0

@trueinViso. , , Я думаю, вы должны задать другой вопрос, касающийся нескольких таблиц. Включите формат таблицы, образцы данных и результаты, которые вы хотите. Этот вопрос очень четко начинается: «Мне нужно сравнить строки в одной таблице запроса». –

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

Это должно дать вам все результаты записях, которые есть до времени, и что все с одинаковым идентификатором также есть вовремя.

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