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

を理解するのに役立ちます願っていますどのように使われるか、どのようにそれをしません「最後のログイン」に関連していますか?なぜあなたはサブセレクトをしていますか?おそらくあなたは(a)あなたのスキーマと(b)あなたが得ているエラーを説明することができますか? – Joe

答えて

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

あなたINサブクエリで複数のフィールドの出力を持つことができません。

2

id INを実行していますが、複数の列と比較しようとしています。代わりにこれを試してみてください:usernameid

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句に1列のみを指定することができ、あなたは2を指定しているということです。

0

2つのフィールドを選択していますが、ここでは1つだけを返す必要があります。この相関サブクエリは、あなたのために働く必要があります。

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 

Hererank機能を使用する方法をいくつかの情報であり、それがどのように適用されます。

Hereは、rank機能に関するmsdnに関する情報です。

Here

Hereは、いくつかの情報におよそWith句でcte機能と使用方法に関するいくつかの情報であり、

が、それはあなたが「ID」とは何

+0

ありがとう、しかし、私は今これらの機能と単語キーRANK()、パーティション、CTEはありません。あなたがそれから学ぶ何らかの情報源を持っているなら、それを紹介してください。 – Ehsan

+0

答えを更新しました。 – Arion

+0

大変感謝していますArion – Ehsan

関連する問題