Вы можете использовать CTE, чтобы захватить последние даты доступа для каждого клиента, а затем РЕГИСТРИРУЙТЕСЬ назад на КТР в получить имя пользователя для каждой из последних дат доступа для каждого клиента. JOIN был бы лучше с точки зрения производительности, удобочитаемости и элегантности, если бы у вашей таблицы был первичный ключ.
;WITH latestClientAccess (ClientId, LatestEventDate) AS (
SELECT ClientId, MAX(EventDate)
FROM MyTable
GROUP BY ClientId
)
SELECT t.ClientId, t.UserName, lca.LatestEventDate [EventDate]
FROM MyTable t
INNER JOIN latestClientAccess lca
ON t.ClientId=lca.ClientId
AND t.EventDate=lca.LatestEventDate
Быстрый локальный тест для концепции и сценария выше может быть выполнен путем запуска сценария ниже. Таким образом, любой, кто смотрит на этот ответ, может протестировать, не создавая никакой схемы.
declare @temp table(ClientId int, EventDate datetime, UserName varchar(20))
insert into @temp
select 1, '2015-11-06 00:00:00', 'user1'
insert into @temp
select 2, '2015-11-06 00:01:00', 'user1'
insert into @temp
select 1, '2015-11-06 00:01:00', 'user2'
insert into @temp
select 1, '2015-11-06 00:03:00', 'user1'
;WITH latestClientAccess (ClientId, LatestEventDate) AS (
SELECT ClientId, MAX(EventDate)
FROM @temp
GROUP BY ClientId
)
SELECT t.ClientId, t.UserName, lca.LatestEventDate [EventDate]
FROM @temp t
INNER JOIN latestClientAccess lca
ON t.ClientId=lca.ClientId
AND t.EventDate=lca.LatestEventDate
EDIT
Учитывая у вас есть первичный ключ и вторая таблица с именем клиента, рассмотрят сценарии ниже:
;WITH latestClientAccess (ClientId, HistoryId) AS (
SELECT ClientId, MAX(HistoryId)
FROM MyTable
GROUP BY ClientId
)
SELECT ct.ClientName, t.UserName, t.EventDate
FROM MyTable t
INNER JOIN latestClientAccess lca
ON t.HistoryId=lca.HistoryId
INNER JOIN MyClientTable ct
ON t.ClientId=ct.ClientId
Для быстрой проверки последней концепции мероприятия (без имени клиента):
declare @temp table(HistoryId int, ClientId int, EventDate datetime, UserName varchar(20))
insert into @temp
select 1, 1, '2015-11-06 00:00:00', 'user1'
insert into @temp
select 2, 2, '2015-11-06 00:01:00', 'user1'
insert into @temp
select 3, 1, '2015-11-06 00:01:00', 'user2'
insert into @temp
select 4, 1, '2015-11-06 00:03:00', 'user1'
;WITH latestClientAccess (ClientId, HistoryId) AS (
SELECT ClientId, MAX(HistoryId)
FROM @temp
GROUP BY ClientId
)
SELECT t.ClientId, t.UserName, t.EventDate
FROM @temp t
INNER JOIN latestClientAccess lca
ON t.HistoryId=lca.HistoryId
Это хау первичный: Идентификатор истории - Спасибо. –
Если HistoryID является постоянно увеличивающимся полем идентификации, вы можете использовать MAX (HistoryID) вместо MAX (EventDate). Это может ускорить соединение немного. –
Спасибо, сэр. Если бы я хотел вернуть в запрос более явное имя для clientId, которое находится в таблицеB как поле sccCompanyName на tableb.sccClientID = table.clientId. Как мне изменить ваш запрос? –