Member 12965461 Ответов: 1

Как сделать выборку записи в SQL в случае нескольких записей.


В приведенном ниже запросе для одного PromotionId у нас есть 2 или 3 записи для ApprovalDate, и таким образом я получаю 3 строки для одного PromotionId. Мне нужна только одна запись ApprovalDate(latestdate) для одного PromotionId.

Как это сделать?

Что я уже пробовал:

select PrmMain.Id as PromotionId,
BpaMain.Id as CustomerId,
Convert (Date,PrmMain.datefrom )as StartDateOfPromotion,
Convert (date,PrmMain.DateInitiation )as InitiationDate,
convert(Date ,WfeRecentState.Done )as ApprovalDate,

Prmmain.Phase

from PrmMain 
inner join BpaMain 
on BpaMain.pkey=PrmMain.BpaMainPKey
inner join WfeRecentState
on PrmMain.PKey=WfeRecentState.ObjectPKey
where PrmMain.Status<>'d'
and BpaMain.status<>'d'
and prmmain.phase<>'deleted'
and PrmMain.TacticParentPKey=''
and PrmMain.SysPeriodPKey='00100000007sown5'

CHill60

Если это вы проголосовали против моего решения, разве оно не сработало? Что же произошло на самом деле?

1 Ответов

Рейтинг:
11

CHill60

Попробуйте добавить внутреннее соединение к подзапросу следующим образом:

inner join (select PrmMain.Id as PromotionId,
MAX(WfeRecentState.Done) as MaxApprovalDate
from PrmMain 
inner join WfeRecentState on PrmMain.PKey=WfeRecentState.ObjectPKey
where PrmMain.Status<>'d'
and prmmain.phase<>'deleted'
and PrmMain.TacticParentPKey=''
and PrmMain.SysPeriodPKey='00100000007sown5' group by PrmMain.Id) as sq on sq.PromotionId = PrmMain.Id AND sq.MaxApprovalDate = WfeRecentState.Done

Предостережение - это непроверено.

Кстати, я очень надеюсь, что это единственная причина, по которой вы это делаете Convert (Date записи создаются потому, что нижележащие столбцы имеют тип DateВремя и не потому что они текстовые


CHill60

Помимо того, что подзапросы вообще ужасны, в чем проблема с решением?