2012-02-27 145 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