2013-07-15 3 views
1

У меня есть эта структуратоп 1 дата дата Еогеасп

table idc (numId,idInt, IdAffiliate) 
table glob (idInt, IdAtt) 
table gratt(IdAtt, dtRomp) 
Table update(IdAffiliate, dateUpdate) 

делает этот оператор выбора даст мне это:

SELECT 
    NumId, 
    dateUpdate, 
    DtRomp, 
    Idc.IdFiliale 
FROM Idc inner join glob on glob .IdInt = Idc.IdInt 
     inner join Grat on Glob.IdAtt = Grat.IdAtt 
     inner join update on update.IdAffiliate = Idc.IdAffiliate 
where NumId = 9976666 

даст мне это:

NumId DtUpdate    DtRomp   filiale 
9976666 01/05/2005   11/07/2006  27 
9976666 01/05/2005   03/07/2008  27 
9976666 01/05/2005   24/06/2010  27 
9976666 01/05/2006   11/07/2006  27 
9976666 01/05/2006    03/07/2008  27 
9976666 01/05/2006   24/06/2010  27 

Я пытаюсь для этого: , чтобы выбрать самый близкий dtUpdqte к DtRomp и это уступает

С наилучшими пожеланиями

Я пытался, но без решения.

+4

Что двигателя и версия? – gbn

+0

Из 'top 1' в заголовке, я бы предположил, что SQL Server – Andomar

+0

Sybase фактически – user2583029

ответ

0

Это сработало с этим !!!!!

SELECT 
NumId, 
dateUpdate, 
DtRomp, 
Idc.IdFiliale 
FROM Idc inner join glob on glob .IdInt = Idc.IdInt 
     inner join Grat on Glob.IdAtt = Grat.IdAtt 
     inner join update on update.IdAffiliate = Idc.IdAffiliate 
where NumId = 9976666 
and datediff(day,dateUpdate,DtRomp) = (
             SELECT 
             min(datediff(day,dateUpdate,DtRomp)) 
             FROM Idc ainner join glob b on a.IdInt = c.IdInt 
             inner join Grat con b.IdAtt = c.IdAtt 
             inner join update d on d.IdAffiliate = Idc.IdAffiliate 
             where NumId = 9976666 and Idc.IdAffiliate = a.IdAffiliate and Grat.DtRompu = c.DtRompu and Grat.DtRompu>DtDebValidite 

            ) 

С уважением

0

Вы можете сделать это с row_number():

select NumId, dateUpdate, DtRomp, Idc.IdFiliale 
from (SELECT NumId, dateUpdate, DtRomp, Idc.IdFiliale, 
      row_number() over (partition by NumID, DTRomp order by DTRomp desc) as seqnum 
     FROM Idc inner join glob on glob .IdInt = Idc.IdInt 
       inner join Grat on Glob.IdAtt = Grat.IdAtt 
       inner join update on update.IdAffiliate = Idc.IdAffiliate 
     where NumId = 9976666 and dateUpdate < DTRomp 
    ) t 
where seqnum = 1; 
+0

Разделение по датеUpdate не может быть прав, если вы ищете последнюю датуUpdate – Andomar

+0

, он продолжает сообщать мне неправильный синтаксис рядом с ключевым словом« Over ' – user2583029

+0

@ пользователь2583029. , , Sybase поддерживает 'row_number()' в течение длительного времени. Вы используете очень старую версию? Поддерживает ли ваша версия CTE (оператор 'with')? –

0

Попробуйте использовать datediff функцию, как показано ниже:

SELECT 
    NumId, 
    dateUpdate, 
    DtRomp, 
    Idc.IdFiliale 
FROM Idc inner join glob on glob .IdInt = Idc.IdInt 
     inner join Grat on Glob.IdAtt = Grat.IdAtt 
     inner join update on update.IdAffiliate = Idc.IdAffiliate 
where NumId = 9976666 
and datediff(day,dateUpdate,DtRomp) = (
             SELECT 
             min(datediff(day,dateUpdate,DtRomp)) 
             FROM Idc inner join glob on glob .IdInt = Idc.IdInt 
             inner join Grat on Glob.IdAtt = Grat.IdAtt 
             inner join update on update.IdAffiliate = Idc.IdAffiliate 
             where NumId = 9976666 

            ) 

More information about datediff().

+0

NumId DtUpdate DtRomp IdFiliale 9976666 01/05/2006 00:00:00 17/07/2002 00:00:00 27 – user2583029

+0

@ user2583029 Я не понимаю. – Parado

+0

это то, что он мне вернул. Линии, которые я пытаюсь сохранить, будут последними 3 на самом деле, я смотрю на логику, чтобы знать, смогу ли я что-нибудь сделать. спасибо за вашу помощь – user2583029

Смежные вопросы