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
Другие вопросы по тегам