Очень простой способ сделать это состоит в том, чтобы использовать Ваш Ваше собственное Settings
класс .
Если вам нужен список идентификаторов каждого компьютера с указанием его главного пользователя, это будет примерно так:
select main.*
from (select ComputerID, UserID, count(1) as cnt
from logTable
group by ComputerID, UserID) as main
inner join (select ComputerID, max(cnt) maxCnt
from (select ComputerID, UserID, count(1) as cnt
from logTable
group by ComputerID, UserID) as Counts)
as maxes
on main.ComputerID = maxes.ComputerID
and main.cnt = maxes.maxCnt
не уверен, что это доступно в MS ACCESS, оно наверняка доступно в SQL Server 05 и 08, поэтому вам придется это изучить.
вы можете использовать удобный ROW_NUMBER () функция, которая позволит вам разделить и присвоить номер строки подмножеству данных, а затем вы можете ограничить возвращаемые результаты на основе этого номера строки.
DECLARE @MaxResultsPerComputerID INT
SELECT @MaxResultsPerComputerID = 3 -- assign the maximum number of results to bring back per computer
SELECT *
FROM (
SELECT ComputerID,
UserID,
LoginDate,
NumberOfTimesLoggedIn, -- Derive this value somehow (not sure what your db schema is)
ROW_NUMBER() OVER (PARTITION BY ComputerID ORDER BY NumberOfTimesLoggedIn) AS RowNumber -- the magic happens here
FROM SomeTable
) a
WHERE RowNumber <= @MaxResultsPerComputerID
create temporary table t select ComputerID, UserID, count(*) as LoginCount
from table group by ComputerID, UserID;
create temporary table m select ComputerID, max(LoginCount) as maxLoginCount
from t group by ComputerID;
select m.ComputerID, max(UserID) from m join t
on m.ComputerID = t.ComputerID and m.maxLoginCount = t.LoginCount
group by ComputerID;
Не могли бы вы проверить это в своей базе данных Access:
select ComputerID, UserID, count(*) as LoginCount
from t2 parent_table
group by ComputerID, UserID
having count(*) = (select max(count(*) ) from t2
where ComputerID = parent_table.ComputerID group by ComputerID, UserID)
order by ComputerID, UserID
SELECT TOP 1 * FROM YOURTABLE ORDER BY LoginCount DESC
(MS - SQL, не уверен, что это работает в Access)
Попробуйте изменить этот пример:
SELECT UserId, MAX(COUNT(*)) as "HighestLogin"
FROM YOURTABLE
GROUP BY ComputerId;
В MS Access я бы написал два три запроса и вызвал бы второй запрос из первого запроса. Первый запрос должен просто произвести подсчет, а следующий запрос найдет максимум первого запроса. Третий запрос будет ссылаться на идентификатор пользователя в первом запросе после объединения обоих первых двух запросов вместе.
Например:
qryCountQuery :
SELECT
LoginCount.ComputerID,
LoginCount.UserID,
Count(LoginCount.ComputerID) AS CountOfComputerID
FROM
LoginCount
GROUP BY
LoginCount.ComputerID, LoginCount.UserID;
qryMaxQuery :
SELECT
qryCountQuery.ComputerID,
Max(qryCountQuery.CountOfComputerID) AS MaxOfCountOfComputerID
FROM
qryCountQuery
GROUP BY
qryCountQuery.ComputerID;
qryCountMaxQueryCombined ]:
SELECT
qryMaxQuery.ComputerID,
qryMaxQuery.MaxOfCountOfComputerID,
qryCountQuery.UserID
FROM
qryCountQuery
INNER JOIN qryMaxQuery
ON (qryCountQuery.CountOfComputerID = qryMaxQuery.MaxOfCountOfComputerID) AND
(qryCountQuery.ComputerID = qryMaxQuery.ComputerID);
ПРИМЕЧАНИЕ. Если у вас есть пользователи, которые «привязаны» к большему количеству входов в систему на одном ПК, ПК будет отображаться дважды с обоими пользователями. Вы можете добавить UNIQUE
или добавить агрегатный вызов FIRST
в еще один запрос. Это зависит от того, обязательно ли вам нужен только один результат для каждого идентификатора компьютера.
ПРИМЕЧАНИЕ2: В другой системе, такой как MySQL, я мог бы использовать вложенные запросы, но я предпочитаю разделять их в Access.
ПРИМЕЧАНИЕ 3. Я забыл, что эта проблема была сложной в Access. Я рад, что протестировал свой код.