Найти наиболее активный или последний идентификатор пользователя по machineid - PullRequest
0 голосов
/ 21 июня 2019

У меня есть таблица со столбцами MachineID, UserID и Date. Каждый день я вставляю / добавляю в эту таблицу запись о том, какой пользователь входит на какой компьютер, поэтому я получаю ежедневный исторический журнал пользователей, вошедших в систему. Мне нужно иметь возможность извлекать из этого наиболее активного пользователя для машины (UserID с наибольшим количеством строк против MachineID), или в случае, если два пользователя привязаны к «первому месту», самый последний из этих двух пользователей .

Я использую SQL 2012 Express. По сути, я дошел до того, что у меня есть MachineID и UserID и количество дат / строк для каждой их комбинации, но я не могу понять, как это сделать дальше.

Использование примера набора данных:

[MachineID] [UserID] [Date]
1   1   20190619
1   1   20190620
1   2   20190621
2   3   20190618
2   3   20190619
2   4   20190620
2   4   20190621

Я запустил SQL:

SELECT DISTINCT MachineID
    , UserID
    , COUNT(DTAdded) as [Logon Count]
FROM MUHistory
GROUP BY MachineID, UserID

и результат:

[MachineID] [UserID]    [Logon Count]
1   1   2
1   2   1
2   3   2
2   4   2

Однако мой желаемый результат:

[MachineID] [UserID]
1   1
2   4

В тех случаях, когда в MachineID '1' Пользователь '1' вошел в систему больше, чем любой другой пользователь, а в MachineID '2' UserID '3' и '4' вошли в систему одинаковое количество раз, но из них UserID '4' имеет самый последний вход в систему.

Заранее спасибо, у меня был поиск вокруг, но я могу найти сообщения только о том или ином результате (наиболее активный или самый последний), но не о двух вместе взятых.

1 Ответ

0 голосов
/ 21 июня 2019

Попробуйте, сначала я нахожу счетчики для входа в систему для каждого пользователя с помощью счетчика (*), затем использую этот счетчик для ранжирования порядка строк по порядку подсчета и дате, чтобы выбрать самый последний случай, когдагалстук.

with a as 
  (     
Select 1 MachineID,  1 UserID,  20190619 Date union all
Select 1 ,  1  , 20190620 union all
Select 1 ,  2  , 20190621 union all
Select 2 ,  3  , 20190618 union all
Select 2 ,  3  , 20190619 union all
Select 2 ,  4  , 20190620 union all
Select 2 ,  4  , 20190621
)
, b as 
(
Select MachineID,UserID, date,
count(*) over (partition by MachineID,UserID order by date asc) cnt
from a
)
,c as 
(
select *
,row_number() Over(partition by MachineID order by cnt desc,date desc) fn
from b
) 
Select MachineID,UserID,date
from c
where fn=1;

о / п:

MachineID   UserID  date
 1          1      20190620
 2         4       20190621
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...