Возврат записи с максимальной датой

Таблица 1_

Client  Employee    Date
198     Jon Doe     3/1/2009
198     Jon Doe     1/1/2009

Таблица – Employee.Status.History

Client  Employee    Date        Status
198     Jon Doe     5/21/2009   T   
198     Jon Doe     3/1/2009    A
198     Jon Doe     1/1/2009    P

Запрашивать только те записи в Employee.Status.History и Employee.Status.XREF, где совпадают Client, Employee и Date.

Возвращает только запись от Employee.Status.History с максимальной датой (от client до employee). В этом случае будет возвращено

Client  Employee    Date        Status
198     Jon Doe     3/1/2009    A

person Community    schedule 14.08.2009    source источник


Ответы (4)


Использование подвыборки и группировки по:

select b.*  
from Employee.Status.History b,  
( select client, employee, max(date) date  
  from Employee.Status.XREF  
  group by client, employee  
) a  
where b.client = a.client  
and   b.employee = a.employee  
and   b.date = a.date  

Внутренний запрос выбирает самую последнюю дату.
Внешний запрос возвращает всю запись на эту дату для связанного клиента и сотрудника.

person xer0x    schedule 14.08.2009

Это должно работать:

SELECT h.*
FROM Employee.Status.History h
INNER JOIN (
    SELECT h.Client, MAX(h.Date) AS MaxDate
    FROM Employee.Status.History h
    INNER JOIN Employee.Status.XREF x ON h.Client = x.Client 
         AND h.Employee = x.Employee AND h.Date = x.Date
) q ON h.Client = q.Client
person eKek0    schedule 15.08.2009

Мой SQL:

SELECT b.* FROM tableXREF a, tableSTATUS b
WHERE b.client = a.client
ORDER BY b.Date DESC
LIMIT 1

MS SQL:

SELECT TOP(1) b.field1, b.field2 etc. FROM tableXREF a, tableSTATUS b
WHERE b.client = a.client
ORDER BY b.Date DESC

Наверное ...

person IgorS    schedule 14.08.2009
comment
Ваше решение будет работать, только если в базе данных есть один пользователь. Хитрость заключается в том, чтобы вернуть записи с максимальной историей для всех пользователей. - person Maciej; 03.05.2013

почему бы не использовать соединение с предложением group by?

select h.client,h.employee,max(h.date),h.Status
from Employee.Status.History h inner join Employee.Status.XREF x on
h.client=x.client and
h.employee=x.employee and
h.date=x.date
group by h.client,h.employee,h.Status
person chad    schedule 15.08.2009
comment
max(h.date) будет возвращать одну и ту же дату для каждой записи, возвращаемой выбором (максимальная дата в наборе). OP ожидает, что запрос вернет объединенную запись с максимальной датой. Эти две вещи очень разные, и поэтому ваш запрос неверен. - person Maciej; 03.05.2013