Как я могу выбрать первые n результатов каждого элемента в предложении WHERE .. IN - PullRequest
3 голосов
/ 29 июня 2011

У меня есть таблица, содержащая несколько имен компьютеров и дату подключения.Вот пример.

ID    Computer         User         Date         
------------------------------------------------
1      O-1234          User1         2010-07-08        
2      O-1234          User2         2010-08-24           
3      O-1234          User2         2010-09-25
4      O-1555          User3         2010-08-24           
5      O-1555          User3         2010-09-25      

Я хотел бы иметь возможность выбрать только последние 2 или 3 подключения для каждого компьютера.Кроме того, я не могу изменить таблицу.У кого-нибудь есть идеи?

Спасибо

РЕДАКТИРОВАТЬ: Это файл MDB MS Access

РЕДАКТИРОВАТЬ ": поскольку RANK OVER () не может быть использован в MS AccessМожно ли использовать временную таблицу для выполнения работы?

Ответы [ 2 ]

6 голосов
/ 29 июня 2011
SELECT *
FROM (
    SELECT ID, Computer, User, Date,
    RANK() OVER ( PARTITION BY Computer ORDER BY Date DESC) AS RowNumber
    FROM YourTable)
WHERE RowNumber <= 3

РЕДАКТИРОВАТЬ: Ох ... это Доступ.

У меня нет доступа к ... э ... Доступ, но можно попробовать вместо этого?

SELECT
    logins.ID,
    logins.Computer,
    logins.User,
    logins.Date,
    COUNT(*)
FROM
    YourTable logins INNER JOIN
    YourTable Subsequentlogins ON
        logins.Computer = Subsequentlogins.Computer
        AND logins.Date <= Subsequentlogins.Date
GROUP BY
    logins.ID,
    logins.Computer,
    logins.User,
    logins.Date
HAVING COUNT(*) <= 3
1 голос
/ 29 июня 2011

Вам нужно как-то их разделить / ранжировать, что может зависеть от базы данных.Если вы укажете, какую базу данных вы используете, мы можем дать более конкретную помощь.

Например, для SQL Server это будет выглядеть примерно так:

SELECT
    Computer
    ,User
    ,Date
    ,LoginRank
FROM
    (SELECT
         Computer
         ,User
         ,Date
         ,RANK() OVER (PARTITION BY Computer ORDER BY Date DESC) as LoginRank
     FROM
         Logins)
WHERE
    LoginRank in (1,2)  -- take the top 2
ORDER BY
    Computer
    ,LoginRank ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...