2012-02-27 148 views
1

我將用戶登錄保存在名爲loginstats的表中,我想檢索每個用戶的最後一次登錄,我使用這些代碼但我遇到了一些錯誤,我的錯誤是什麼?在sql server 2008中嵌套選擇

select * 
from loginStats 
where id in (
    select distinct username, MAX(id) as id 
    from loginStats 
    group by username) 
+0

什麼是「ID」,它是如何涉及「上次登錄」?你爲什麼要做一個子選擇?也許你可以解釋(a)你的模式和(b)你得到什麼錯誤? – Joe 2012-02-27 19:23:36

回答

1
select * 
from loginStats 
where id in (
    select distinct MAX(id) as id 
    from loginStats 
    group by username) 

你不能在你的IN子查詢多場輸出。

2

您正在做id IN,但正試圖將其與多列進行比較。試試這個:

SELECT A.* 
FROM LoginStats A 
INNER JOIN (SELECT DISTINCT username, MAX(id) as id 
      FROM loginStats 
      GROUP BY username) B 
ON A.username = B.username AND A.id = B.id 
0

的錯誤是IN子句中只有一列可以指定與你指定兩個:usernameid

0

您正在選擇兩個字段,您應該只返回一個字段。此相關子查詢應該爲你工作:

select * 
from loginStats AS a 
where id = (
    select MAX(id) as id 
    from loginStats AS b 
    where b.username = a.username) 
1

或者你也可以做到這一點是這樣的:

;WITH CTE 
AS 
(
    SELECT 
     RANK() OVER(
        PARTITION BY loginStats.username 
        ORDER BY loginStats.id DESC 
       ) AS iRank, 
     loginStats.* 
    FROM 
     loginStats 
) 
SELECT 
    * 
FROM 
    CTE 
WHERE 
    CTE.iRank=1 

Here是一些信息,如何使用rank功能以及它是如何應用。

Here是msdn上關於rank函數的一些信息。

Here約爲cte的功能和用法的一些信息

Here是一些有關With條款以及如何使用

希望它可以幫助你瞭解

+0

謝謝,但我現在沒有這些功能和文字鍵RANK(),分區,CTE。如果你有一些我可以從中學習的資料,請介紹一下。 – Ehsan 2012-02-28 11:39:26

+0

更新了答案.. – Arion 2012-02-28 12:11:58

+0

非常感謝親愛的Arion – Ehsan 2012-02-28 12:38:13