SQL Lastest Date для каждого пользователя - устранение дубликатов
Я просмотрел более 30 различных способов получить самую последнюю дату из объединенной таблицы. Нужна помощь от профи.
Замечания:
- Использование SolarWinds для создания пользовательских отчетов SQL
- Довольно новый для SQL
Я пытаюсь получить список всех моих пользователей с их именем пользователя, основной группой, именем и самой последней датой входа в систему. Эти данные распределены между двумя таблицами.
Проблема в том, что текущий код, который у меня есть, дает мне длинный список дублирующих пользователей с одинаковой датой. Мне просто нужен список всех моих пользователей с их последней датой входа в систему.
Это код, который я придумал, он создает мой отчет без проблем, но все равно показывает мне дубликаты, группировка вообще отсутствует. Что я могу пропустить?
SELECT
b.AccountName,
a.UserName,
b.PrimaryGroup,
b.MemberList,
a.LogonDateTime,
a.UserID
FROM UDT_UserLastActivity a
JOIN (
SELECT UserID, MAX(LogonDateTime) maxLogon
FROM UDT_UserLastActivity
GROUP BY UserID
) maxRecord
ON maxRecord.UserID = a.UserID
AND maxRecord.maxLogon = a.LogonDateTime
JOIN UDT_User b
ON b.UserID = a.UserID
ORDER BY a.LogonDateTime DESC
Заранее спасибо всем и всем, кто хочет помочь!
3 ответа
Просто сгруппировать и искать макс
SELECT
b.AccountName,
a.UserName,
b.PrimaryGroup,
b.MemberList,
max(a.LogonDateTime) as LastDate,
a.UserID
FROM UDT_UserLastActivity a
JOIN (
SELECT UserID, MAX(LogonDateTime) maxLogon
FROM UDT_UserLastActivity
GROUP BY UserID
) maxRecord
ON maxRecord.UserID = a.UserID
AND maxRecord.maxLogon = a.LogonDateTime
JOIN UDT_User b
ON b.UserID = a.UserID
group by
b.AccountName,
a.UserName,
b.PrimaryGroup,
b.MemberList,
a.UserID
ORDER BY a.LogonDateTime DESC
Вы можете использовать группу по методу, как описано выше, или вы можете просто использовать функцию DISTINCT, как показано ниже:
SELECT DISTINCT
b.AccountName,
a.UserName,
b.PrimaryGroup,
b.MemberList,
a.LogonDateTime,
a.UserID
FROM UDT_UserLastActivity a
JOIN (
SELECT UserID, MAX(LogonDateTime) maxLogon
FROM UDT_UserLastActivity
GROUP BY UserID
) maxRecord
ON maxRecord.UserID = a.UserID
AND maxRecord.maxLogon = a.LogonDateTime
JOIN UDT_User b
ON b.UserID = a.UserID
ORDER BY a.LogonDateTime DESC;
Кроме того, если вы собираетесь использовать функцию MAX(), вы сможете полностью удалить соединение подзапроса для maxrecord, см. Ниже:
SELECT
b.AccountName,
a.UserName,
b.PrimaryGroup,
b.MemberList,
MAX(a.LogonDateTime) as maxLogonDateTime,
a.UserID
FROM UDT_UserLastActivity a
JOIN UDT_User b
ON b.UserID = a.UserID
GROUP BY b.AccountName,
a.UserName,
b.PrimaryGroup,
b.MemberList,
a.UserID
ORDER BY MAX(a.LogonDateTime) DESC;
Надеюсь, это поможет.
Мне просто нужен список всех моих пользователей с их последней датой входа в систему.
Предполагая, что основные данные находятся в таблице пользователей, и вам нужен только LogonDateTime из таблицы действий:
SELECT
u.AccountName,
u.UserName,
u.PrimaryGroup,
u.MemberList,
(-- Scalar subquery to get the last logon
SELECT MAX(LogonDateTime)
FROM UDT_UserLastActivity AS ula
WHERE ula.UserID = u.UserID
) AS LastLogon,
u.UserID
FROM UDT_User AS u
ORDER BY LastLogon DESC