77

SQLServerでの使用に問題がありRANK()ます。

これが私のコードです:

SELECT contendernum,
       totals, 
       RANK() OVER (PARTITION BY ContenderNum ORDER BY totals ASC) AS xRank
FROM (
   SELECT ContenderNum,
          SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
   FROM Cat1GroupImpersonation
   GROUP BY ContenderNum
) AS a

そのクエリの結果は次のとおりです。

contendernum    totals    xRank
          1       196        1
          2       181        1
          3       192        1
          4       181        1
          5       179        1

私の望む結果は次のとおりです。

contendernum    totals    xRank
          1       196        1
          2       181        3
          3       192        2
          4       181        3
          5       179        4

に基づいて結果をランク付けしたいと思いtotalsます。のような同じ値がある場合181、2つの数値は同じになりxRankます。

4

8 に答える 8

85

変化する:

RANK() OVER (PARTITION BY ContenderNum ORDER BY totals ASC) AS xRank

に:

RANK() OVER (ORDER BY totals DESC) AS xRank

この例を見てください:

SQLフィドルデモ

また、 RANK(Transact-SQL)DENSE_RANK(Transact-SQL)の違いも確認することをお勧めします。

RANK(Transact-SQL)

2つ以上の行がランクで同点の場合、同点の各行は同じランクを受け取ります。たとえば、上位2人の営業担当者が同じSalesYTD値を持っている場合、両方とも1つにランク付けされます。次に高いSalesYTDの営業担当者は、上位にランク付けされた2つの行があるため、3番目にランク付けされます。したがって、RANK関数は常に連続した整数を返すとは限りません。

DENSE_RANK(Transact-SQL)

結果セットのパーティション内の行のランクを、ランクにギャップなしで返します。行のランクは、1に、問題の行の前にある個別のランクの数を加えたものです。

于 2012-10-05T03:52:15.973 に答える
20

「SQLServerでRank()を使用する方法」という質問のタイトルに答えるには、次のように機能します。

このデータセットを例として使用します。

create table #tmp
(
  column1 varchar(3),
  column2 varchar(5),
  column3 datetime,
  column4 int
)

insert into #tmp values ('AAA', 'SKA', '2013-02-01 00:00:00', 10)
insert into #tmp values ('AAA', 'SKA', '2013-01-31 00:00:00', 15)
insert into #tmp values ('AAA', 'SKB', '2013-01-31 00:00:00', 20)
insert into #tmp values ('AAA', 'SKB', '2013-01-15 00:00:00', 5)
insert into #tmp values ('AAA', 'SKC', '2013-02-01 00:00:00', 25)

基本的にグループ化を指定するパーティションがあります。

この例では、column2でパーティション化すると、rank関数はcolumn2値のグループのランクを作成します。column2='SKA'の行とcolumn2='SKB'の行のランクは異なります。

ランクは次のように決定されます。すべてのレコードのランクは、1に、パーティション内でそのレコードの前に来るランクの数を加えたものです。ランクは、選択したフィールドの1つ(パーティション化されたフィールドを除く)がその前のフィールドと異なる場合にのみ増加します。選択したすべてのフィールドが同じである場合、ランクは同点になり、両方に値1が割り当てられます。

これを知っていると、2列目の各グループから1つの値だけを選択したい場合は、次のクエリを使用できます。

with cte as 
(
  select *, 
  rank() over (partition by column2 
             order by column3) rnk
  from t

) select * from cte where rnk = 1 order by column3;

結果:

COLUMN1 | COLUMN2   | COLUMN3                           |COLUMN4 | RNK
------------------------------------------------------------------------------
AAA     | SKB   | January, 15 2013 00:00:00+0000    |5   | 1
AAA     | SKA   | January, 31 2013 00:00:00+0000    |15  | 1
AAA     | SKC   | February, 01 2013 00:00:00+0000   |25  | 1

SQLデモ

于 2013-07-16T14:02:25.783 に答える
10

RANKではなくDENSE_RANKを使用する必要があります。唯一の違いは、ギャップを残さないことです。また、contender_numでパーティション化しないでください。そうしないと、各候補者を別々のグループにランク付けするため、それぞれが分離されたグループで1位にランク付けされます。

SELECT contendernum,totals, DENSE_RANK() OVER (ORDER BY totals desc) AS xRank FROM
(
SELECT ContenderNum ,SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
FROM dbo.Cat1GroupImpersonation
 GROUP BY ContenderNum
) AS a
order by contendernum

StackOverflowを使用するためのヒントとして、DDLとサンプルデータを投稿してください。そうすれば、他の人が自分の時間を節約できるようになります。

create table Cat1GroupImpersonation (
contendernum int,
criteria1 int,
criteria2 int,
criteria3 int,
criteria4 int);

insert Cat1GroupImpersonation select
1,196,0,0,0 union all select
2,181,0,0,0 union all select
3,192,0,0,0 union all select
4,181,0,0,0 union all select
5,179,0,0,0;
于 2012-10-05T03:53:58.673 に答える
3

DENSE_RANK()はギャップのないランクです。つまり、「密」です。

select Name,EmailId,salary,DENSE_RANK() over(order by salary asc) from [dbo].[Employees]

RANK()-ランク間のギャップが含まれています。

select Name,EmailId,salary,RANK() over(order by salary asc) from [dbo].[Employees]
于 2016-07-28T11:48:25.843 に答える
0

すでにContenderNumでグループ化されているので、再度パーティション化する必要はありません。Dense_rank()を使用して、合計の説明で並べ替えます。要するに、

SELECT contendernum,totals, **DENSE_RANK()** 
OVER (ORDER BY totals **DESC**) 
AS xRank 
FROM
(
   SELECT ContenderNum ,SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
   FROM dbo.Cat1GroupImpersonation
   GROUP BY ContenderNum
) AS a
于 2013-08-20T11:52:39.677 に答える
0
SELECT contendernum,totals, RANK() OVER (ORDER BY totals ASC) AS xRank FROM
(
SELECT ContenderNum ,SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
FROM dbo.Cat1GroupImpersonation
 GROUP BY ContenderNum
) AS a
于 2014-08-27T09:17:24.207 に答える
0

RANK()良いですが、等しいか類似した値に同じランクを割り当てます。また、一意のランクが必要な場合は、ROW_NUMBER()でこの問題を解決できます

ROW_NUMBER() OVER (ORDER BY totals DESC) AS xRank
于 2018-08-10T15:56:23.723 に答える
-1

T.Tamil、T.English、T.Maths、T.Total、Dense_Rank()Over(Order by T.Total Desc)をStd_Rank Fromとして選択します(Tamil、English、Maths、(Tamil + English + Maths)をTotalFromとして選択します学生)Tとして

ここに画像の説明を入力してください

于 2018-04-23T11:05:53.883 に答える