Процедура SQL: выбор наивысшей даты во внутреннем СОЕДИНЕНИИ

#mysql

#mysql

Вопрос:

В настоящее время у меня есть следующая процедура:

         CREATE TABLE #Appointments (
    [aptUniqueID] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [aptTime] datetime,
    [aptWorkToDo] [varchar] (512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [aptStateDispChar] [varchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [aptStateTextColor] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [aptStateBgcolor] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [aptPatientID] [varchar] (8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,     
    [aptPatientFullName] [varchar] (130) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [aptEntryTime] datetime,
) ON [PRIMARY]

-- Insert appointments data into temp table
INSERT INTO #Appointments  ( aptUniqueID, aptTime, aptWorkToDo, aptStateDispChar, aptStateTextColor, aptStateBgcolor, aptPatientID, aptPatientFullName, aptEntryTime )
SELECT  CONVERT(varchar(36), apt.UniqueID), 
        apt.atime, 
        RTRIM(apt.apwork)   ' '   RTRIM(apt.apwrk2),
        aps.apsdispchar,
        RTRIM(LTRIM(aps.apstextcolor)),
        RTRIM(LTRIM(aps.apsbgcolor)),
        apT.apid,
        dbo.MakeCaseString(pat.pfname, pat.pfnamcase)   ' '   dbo.MakeCaseString(pat.plname, pat.plnamcase),
        apn.apnentrytime
        FROM apt INNER JOIN pat ON pat.pid = apt.apid INNER JOIN aps on ((apt.aconfstat IS NOT NULL AND apt.aconfstat = aps.apsid) OR (apt.aconfstat IS NULL AND aps.apsid = ' ')) INNER JOIN apn ON (apn.apnpid = apt.apid AND apn.apndate = apt.adate AND apn.apntime = apt.atime)
WHERE apt.adid = @ProviderIDParam   AND apt.adate = @DateParam
ORDER BY apt.atime ASC
  

Внутри моего внутреннего соединения, как я могу вернуть дату MAX () из apn.apnentrytime (поле DATETIME)?

На данный момент он возвращает две строки данных, когда я хочу, чтобы он возвращал только строку с самым высоким (самым последним) значением apnentrytime.

Ответ №1:

Что-то вроде:

 WHERE apn.apnentrytime = MAX(apn.apnentrytime)
  

Комментарии:

1. добавление дополнительного оператора where вызывает следующую ошибку: агрегат может не отображаться в предложении WHERE, если он не находится в подзапросе, содержащемся в предложении HAVING или списке выбора, а агрегируемый столбец является внешней ссылкой. с помощью кода: ГДЕ apt.adid = @ProviderIDParam И apt.adate = @DateParam И apn.apnentrytime = MAX (apn.apnentrytime)

2. Извините, тогда, не уверен, я как бы стрелял от бедра по этому вопросу 🙂

Ответ №2:

 select  convert(varchar(36), apt.uniqueid), 
        apt.atime, 
        rtrim(apt.apwork)   ' '   rtrim(apt.apwrk2),
        aps.apsdispchar,
        rtrim(ltrim(aps.apstextcolor)),
        rtrim(ltrim(aps.apsbgcolor)),
        apt.apid,
        dbo.makecasestring(pat.pfname, pat.pfnamcase)   ' '   dbo.makecasestring(pat.plname, pat.plnamcase),
        apn.apnentrytime
from apt 
inner join pat on pat.pid = apt.apid 
inner join aps on
    (apt.aconfstat is not null and apt.aconfstat = aps.apsid) 
    or 
    (apt.aconfstat is null and aps.apsid = ' ')
inner join (
    select apnpid, apndate, apntime, max(apnentrytime) as apnentrytime
    from apn
    group by apnpid, apndate, apntime
    ) apn on (apn.apnpid = apt.apid and apn.apndate = apt.adate and apn.apntime = apt.atime)
where apt.adid = @provideridparam and apt.adate = @dateparam
order by apt.atime asc