#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