2012-06-28 3 views
-1

Посмотрите на таблицу (например, TRClient)Путаница в SQL запросе

 
| ID | clientid | sId | startdate | enddate  | 
|----|----------|-----|--------------|--------------| 
| 1 | 10  | 1 | '2011-06-01' | '2012-05-31' | 
| 2 | 25  | 3 | '2011-06-01' | '2012-05-31' | 
| 3 | 10  | 1 | '2012-06-01' | '2013-05-31' | 

Я хочу clientid которого enddate является не больше или равно это предыдущий рекорд в enddate (связь между двумя записями можно определить с помощью sId).

Я сделал следующий запрос:
(здесь я использую цикл для каждого идентификатора клиента в TRClient)

Select clientid from TRClient where clientId = 10 and sId = 1 and not (endDate >= '2012-05-31') 

Я хочу, чтобы проверить запись для самого высокого идентификатора для каждого клиента (если ClientID и Sid являются то же самое, то он должен проверить только для одной записи, чей идентификатор больше. например, в данной таблице, если мы говорим о clientid = 10 и sid = 1 мы получим две строки (id = 1 and id = 3). Здесь я хочу, чтобы проверить enddate >= '2012-05-31' for id = 3)

+0

Вы можете упростить это, заказав его в порядке возрастания, таким образом, что каждая следующая строка всегда будет равна или больше текущей строки, но не менее что. – madhairsilence

+1

Являются ли столбцы 'startdate' и' enddate' типа 'date'? Потому что, если они являются строками, как это выглядит с первого взгляда, вы не сможете сравнивать их в таком формате. Я считаю, единственное достоверное сравнение строк дат будет в формате yyyy-mm-dd. –

+0

@ AndriusNaruševičius да, тип данных обоих столбцов - ** datetime ** – hims056

ответ

0

Это то, что я хотел бы сделать:

SELECT ClientId FROM TRClient WHERE Id = (SELECT MAX(Id) FROM TRClient 
WHERE ClientId = 10 AND sId = 1) AND StartDate >= '2012-05-31' 
0

ли вы имеете в виду это?

select * from TRClient trc1 join TRClient trc2 on trc1.id = trc2.sid 
where trc1.startDate <= trc2.endDate 

или

select * from TRClient trc1 where exists 
(select 1 from TRClient trc2 where trc2.sid = trc1.id and trc1.startDate <= trc2.endDate) 
0
SELECT ClientID 
FROM TRClient AS TRC1 
WHERE startDate < (SELECT EndDate 
        FROM TRClient AS TRC2 
        WHERE TRC2.ID = (SELECT Max(ClientID) 
             FROM TRClient AS TRC3 
             WHERE TRC3.ID < TRC1.ID)) 

Я забыл использовать Sid и ClientID, но вы можете добавить их в мой код, вы получите точку?

1

Если в базе данных находятся столбцы datetime, и вы хотите их сравнить, то вам нужны действительные значения для сравнения.

Попробуйте это:

SELECT clientid 
FROM TRClient 
WHERE clientId = 10 
    AND sId = 1 
    AND DATEDIFF(n, startDate,'05/31/2012') > 0 

Если вы пишете формат строки, как '05/31/2012' SQL сервера пытаются преобразовать его автоматически. В зависимости от локалей сервера вы можете обрабатывать месяц/день.