0

私はこのようなテーブルを持っています

userEmail | views

  A          8
  B          3
  C          4
  A          2
  B          5

私は特定のユーザーのランクを取得したい..

私がやっていることは:

SET @rank=0;
select @rank:=@rank+1 AS rank , userEmail,sum(views) as views from mtable where userEmail != 'null' Group By userEmail Order By views DESC 

これは次のようなものを出力します:

rank  | userEmail | views

  1        A          10
  2        B           8
  3        C           4

すべてのユーザーのランクを取得できますが、1 人のユーザーのみのランクを表示したい場合はどうすればよいですか??

where userEmail = 'B'上記のクエリを入力すると

私はこれを取得します:

rank  | userEmail | views

  1        B           8

しかし、それは次のようになるはずです:

 rank  | userEmail | views

  2          B           8
4

3 に答える 3

1

ゴーダンが指摘したように、私の最初の答えはあまり標準的ではありません。これが同じことをする標準的な方法です。

SELECT T.userEmail, T.views, RANK() OVER (ORDER BY T.views DESC) AS viewRank
FROM (
  select userEmail,sum(views) as views 
  from mtable 
  where userEmail != 'null' 
  Group By userEmail) AS T
Order By T.views DESC

SQL Server 2005+およびOracle(句を使用)でこれを行う特別な方法がありますOVERが、一般的な答え(mysqlで使用する必要があります)はwhere句を使用することです。このような:

SET @rank=0;

SELECT T.rank, T.userEmail, T.views 
FROM (
  select @rank:=@rank+1 AS rank , userEmail,sum(views) as views 
  from mtable 
  where userEmail != 'null' 
  Group By userEmail Order By views DESC ) AS T
WHERE T.userEmail='somename@somewhere.com'
于 2012-07-21T10:29:59.767 に答える
0

SQLでは、一時テーブルのユーザーが同じものをクエリの下でチェックすることが可能です。

create table #tmp (randomno int,email varchar(10),viewsum int)
insert into #tmp select  ROW_NUMBER() over (order by sum(vi) desc) as 'rank', email,SUM(vi) 
from test
 group by email




select * from #tmp where email = 'B'
 drop table #tmp
于 2012-07-21T10:33:10.953 に答える
0

@Hoganは一般的なアプローチを持っていると主張しているので、私はこれに答えています。すべての SQL データベースで機能する一般的なアプローチがありますが、それだけではありません。

一般的なアプローチでは、自己結合が必要です。

select t.useremail, t.views, count(*) as rownumber
from t left join
     t tless
     on t.useremail = tless.useremail and
        t.views >= tless.views
group by t.useremail, t.views

ビューに重複がある場合、次は密なランキングに相当します。

select t.useremail, t.views, count(distinct tless.views) as denserank
from t left join
     t tless
     on t.useremail = tless.useremail and
        t.views >= tless.views
group by t.useremail, t.views

また、クエリはデータベースを明示的に言及していないため、ほとんどのデータベースでは、次のように単純に使用できます。

select t.usermail, t.views, row_number() over (partition by usermail order by views)
from t
于 2012-07-21T12:46:27.833 に答える