Как выбрать строку на основе макс. количества? (использование стандарта sql)

Очень простой способ сделать это состоит в том, чтобы использовать Ваш Ваше собственное Settings класс .

5
задан tbone 12 December 2009 в 00:05
поделиться

6 ответов

Если вам нужен список идентификаторов каждого компьютера с указанием его главного пользователя, это будет примерно так:

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
5
ответ дан 18 December 2019 в 13:15
поделиться

не уверен, что это доступно в 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
2
ответ дан 18 December 2019 в 13:15
поделиться
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;
0
ответ дан 18 December 2019 в 13:15
поделиться

Не могли бы вы проверить это в своей базе данных 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
0
ответ дан 18 December 2019 в 13:15
поделиться
SELECT TOP 1 * FROM YOURTABLE ORDER BY LoginCount DESC

(MS - SQL, не уверен, что это работает в Access)

Попробуйте изменить этот пример:

SELECT UserId, MAX(COUNT(*)) as "HighestLogin"
FROM YOURTABLE
GROUP BY ComputerId;
2
ответ дан 18 December 2019 в 13:15
поделиться

В 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. Я рад, что протестировал свой код.

5
ответ дан 18 December 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: