Оператор SQL для определения основного компьютера для назначенного пользователя на основе количества входов в систему - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь получить инструкцию SQL для определения основного компьютера для назначенного пользователя на основе количества входов в систему.У меня есть данные и пытаюсь определить правильную логику.

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

Данные:

PreviouslyloggedHistory | LogonCount | ComputerName |  OS  | AssetAssigned
user1                   |     31     |  computer1   |  W7  | user1
user5                   |     1      |  computer1   |  W7  | user1
user2                   |     1      |  computer2   |  W7  | user2  
user2                   |     28     |  computer2   |  W7  | user2  
user3                   |     1      |  computer2   |  W7  | user2 
user4                   |     1      |  computer3   |  W10 | user2
user5                   |     1      |  computer3   |  W10 | user2
user2                   |     3      |  computer2   |  W7  | user2
user5                   |     1      |  computer4   |  W10 | user6
user6                   |     1      |  computer4   |  W10 | user6
user7                   |     1      |  computer4   |  W10 | user6
user6                   |     3      |  computer5   |  W10 | user6
user5                   |     1      |  computer4   |  W10 | user6
user6                   |     1      |  computer4   |  W10 | user6
user7                   |     1      |  computer4   |  W10 | user6
user5                   |     1      |  computer4   |  W10 | user6
user6                   |    22      |  computer6   |  W7  | user6
user6                   |     1      |  computer5   |  W10 | user6
user6                   |     1      |  computer4   |  W10 | user6
user7                   |     1      |  computer4   |  W10 | user6
user6                   |     7      |  computer5   |  W10 | user6

Вот запрос, который я пробовал.Я все еще получаю много результатов, когда машины помечены как основные для более чем одной машины с той же ОС.Я не могу понять, как отфильтровать низкие запросы на вход в систему из запроса для того же имени компьютера.


select *,
CASE
 WHEN [PreviouslyloggedHistory] = [AssetAssigned] THEN 'Primary'
 WHEN [PreviouslyloggedHistory] != [AssetAssigned] THEN 'Secondary'
 ELSE 'Unknown'
End 'TagIt'
FROM TABLE
ORDER BY [AssetAssigned] DESC

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Ваши измененные спецификации под моим предыдущим ответом показывают, что вы не знали точно, какой результат вы получилиЭто часто является причиной неправильных запросов, и поэтому мы всегда запрашиваем пример результата в запросе.Это помогло бы нам и, возможно, в первую очередь помогло бы вам.

Вы сказали, что хотите сохранить исходные строки и хотите найти максимально используемый компьютер на пользователя, и если быдва таких компьютера с одной и той же ОС, мы должны были бы выбрать один произвольно.Теперь кажется, что вы не хотите сохранять исходные строки, а просто показывает одну строку для каждого пользователя и компьютера и помечаете один компьютер для каждой пользовательской ОС как основной.Это намного, намного проще.

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

select
  asset_user, computername, os, sum(logoncount) as total_logins,
  case when row_number() over (partition by asset_user, os
                               order by sum(logoncount) desc, computername) = 1
    then 'primary'
    else 'secondary'
  end as priority
from mytable
where login_user = asset_user
group by asset_user, computername, os
order by asset_user, priority, os, computername;

Результат:

+------------+--------------+-----+--------------+-----------+
| asset_user | computername | os  | total_logins | priority  |
+------------+--------------+-----+--------------+-----------+
| user1      | computer1    | W7  |           31 | primary   |
| user2      | computer2    | W7  |           32 | primary   |
| user6      | computer5    | W10 |           11 | primary   |
| user6      | computer6    | W7  |           22 | primary   |
| user6      | computer4    | W10 |            3 | secondary |
+------------+--------------+-----+--------------+-----------+

Демонстрация: https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=8ab619f88b8e1adfff81e3d18e0446fe

0 голосов
/ 24 февраля 2019

Поскольку вы хотите сохранить строки, мы используем аналитические функции для агрегирования по строкам пользователя.

Шаги:

  1. Примените предложение WHERE, чтобы видеть только вход пользователейна свои компьютеры.
  2. Добавьте счетчик для каждого пользователя и компьютера, чтобы увидеть, как часто пользователь заходил на этот компьютер.
  3. Сравните с максимальным счетом на пользователя, чтобы отметить основной компьютер (ы).
  4. Дополнительно ранжируйте строки для каждого пользователя и ОС, чтобы выбрать только один компьютер для каждой ОС в качестве основного.

Запрос:

with counted as
(
  select 
    asset_user, computername, os, logoncount,
    sum(logoncount) over (partition by asset_user, computername) as cnt
  from mytable
  where login_user = asset_user
)
select
  asset_user, computername, os, logoncount,
  case when cnt = max(cnt) over(partition by asset_user)
        and rank() over (partition by asset_user, os order by cnt desc, computername) = 1
         then 'primary'
         else 'secondary'
       end as priority
from counted
order by asset_user, priority, os;

Результат:

+------------+--------------+-----+------------+-----------+
| asset_user | computername | os  | logoncount | priority  |
+------------+--------------+-----+------------+-----------+
| user1      | computer1    | W7  | 31         | primary   |
| user2      | computer2    | W7  | 1          | primary   |
| user2      | computer2    | W7  | 28         | primary   |
| user2      | computer2    | W7  | 3          | primary   |
| user6      | computer6    | W7  | 22         | primary   |
| user6      | computer5    | W10 | 7          | secondary |
| user6      | computer5    | W10 | 3          | secondary |
| user6      | computer5    | W10 | 1          | secondary |
| user6      | computer4    | W10 | 1          | secondary |
| user6      | computer4    | W10 | 1          | secondary |
+------------+--------------+-----+------------+-----------+

Демо: https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=309ee5ff85d4b863b04f8c40d98527da

...