SQL select max (дата) и соответствующее значение - программирование
Подтвердить что ты не робот

SQL select max (дата) и соответствующее значение

Возможный дубликат:
Как получить запись таблицы, которая содержит максимальное значение?

У меня есть сводный запрос вроде:

SELECT TrainingID, Max(CompletedDate) as CompletedDate, Max(Notes) as Notes     --This will only return the longest notes entry
FROM HR_EmployeeTrainings ET
WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID)
GROUP BY AvantiRecID, TrainingID            

Работает и возвращает правильные данные большую часть времени, но я заметил проблему. Поле Notes, которое возвращается, не обязательно соответствует записи, из которой выполняется max (completedDate). Вместо этого это будет самая длинная строка? Или тот, который имеет самое высокое значение ASCII? Что делает SQL Server в случае связи между двумя записями? Я даже не уверен. Я хочу получить поле примечаний из записи max (completedDate). Как мне это сделать?

4b9b3361

Ответ 1

Вы можете использовать подзапрос. Подзапрос получит Max(CompletedDate). Затем вы берете это значение и снова присоединяетесь к таблице, чтобы получить связь с записью с этой датой:

select ET1.TrainingID,
  ET1.CompletedDate,
  ET1.Notes
from HR_EmployeeTrainings ET1
inner join
(
  select Max(CompletedDate) CompletedDate, TrainingID
  from HR_EmployeeTrainings
  --where AvantiRecID IS NULL OR AvantiRecID = @avantiRecID
  group by TrainingID
) ET2
  on ET1.TrainingID = ET2.TrainingID
  and ET1.CompletedDate = ET2.CompletedDate
where ET1.AvantiRecID IS NULL OR ET1.AvantiRecID = @avantiRecID

Ответ 2

А да, так оно и есть в SQL. Вы получаете Макс каждого столбца отдельно. Кажется, что вы хотите вернуть значения из строки с максимальной датой, поэтому вам нужно выбрать строку с максимальной датой. Я предпочитаю делать это с помощью подзапроса, так как запросы сохраняют компактность легко читаемой.

SELECT TrainingID, CompletedDate, Notes
FROM HR_EmployeeTrainings ET 
WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID) 
AND CompletedDate in 
   (Select Max(CompletedDate) from HR_EmployeeTrainings B
    where B.TrainingID = ET.TrainingID)

Если вы также хотите совместить с AntiRecID, вы должны включить это также в подзапрос.

Ответ 3

Нет простого способа сделать это, но что-то вроде этого будет работать:

SELECT ET.TrainingID, 
  ET.CompletedDate, 
  ET.Notes
FROM 
HR_EmployeeTrainings ET
inner join
(
  select TrainingID, Max(CompletedDate) as CompletedDate
  FROM HR_EmployeeTrainings
  WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID)
  GROUP BY AvantiRecID, TrainingID  
) ET2 
  on ET.TrainingID = ET2.TrainingID
  and ET.CompletedDate = ET2.CompletedDate

Ответ 4

Каждая функция MAX оценивается индивидуально. Таким образом, MAX (CompletedDate) вернет значение последнего столбца CompletedDate, а MAX (Notes) вернет максимальное значение (то есть самое высокое по алфавиту).

Вам нужно структурировать свой запрос по-разному, чтобы получить то, что вы хотите. Этот вопрос уже был задан и несколько раз ответил, поэтому я не буду его повторять:

Как найти запись в таблице, которая содержит максимальное значение?

Поиск записи с максимальным значением в SQL