如何在WHERE .. IN子句中选择每个元素的前n个结果

时间:2011-06-29 14:58:00

标签: sql ms-access

我有一个包含多个计算机名称和连接日期的表。这是一个例子。

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个连接。另外,我无法修改表格。有人有想法吗?

谢谢

编辑:这是一个MS Access mdb文件

EDIT“:由于RANK OVER()不能在MS Access中使用,是否可以使用临时表来完成这项工作?

2 个答案:

答案 0 :(得分:6)

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 :(得分:1)

你需要以某种方式对它们进行分区/排序,这可能与数据库相关。如果您指明您正在使用的数据库,我们可以提供更具体的帮助。

例如,对于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