SQL Lastest Date для каждого пользователя - устранение дубликатов - PullRequest
0 голосов
/ 19 декабря 2018

Я просмотрел 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 ]

0 голосов
/ 19 декабря 2018

Мне просто нужен список всех моих пользователей с их последней датой входа в систему.

Предполагая, что основные данные находятся в таблице пользователей, и вам нужен только 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
0 голосов
/ 19 декабря 2018

Вы можете использовать группирование по методу, как описано выше, или вы можете просто использовать функцию 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;

Надеюсь, это поможет.

0 голосов
/ 19 декабря 2018

Просто сгруппируйте и найдите max

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
...