2011-06-29 83 views
3

我有一個包含多個計算機名稱和連接日期的表。這是一個例子。如何在WHERE .. IN子句中選擇每個元素的前n個結果

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訪問mdb文件

編輯「:由於RANK OVER()不能在MS Access中使用,這將有可能使用臨時表做這項工作?

+2

你在用什麼DBMS? – 2011-06-29 14:59:12

+0

關於哪個RDBMS? – CristiC

+0

這是ms訪問mdb文件 – JackDurkalik

回答

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 
+0

我知道RANK()OVER在ms訪問中不可用,是否有可能使子請求模仿這個命令的效果? – JackDurkalik

+0

我知道這是遠離最好的事情使用,但遺憾的是這不是我的決定...我會嘗試你的解決方案,並很快回來 – JackDurkalik

+0

我剛剛添加INNER JOIN,因爲我有一個查詢錯誤,它的工作。非常感謝Michael – JackDurkalik

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 
+0

感謝您嘗試Daniel,在Michael的幫助下找到了答案。祝你今天愉快 ! – JackDurkalik