2017-02-13 18 views
0

コード:私はランクランク関数をランダムと他のdbフィールドよりも使用できますか?

+0

名前に追加する文字としてnewidをキャストするだけで済みます。それはサブクエリでよりきれいに見えるかもしれませんが、私はそれがなければ動作すると思います。 –

+0

ps私はこれをやろうと思っていません。質問結果を再現できるようにしたいと思います。 –

+0

あなたが私の質問を正しく受けているかどうか分かりません名前と生成されている乱数に基づいてランクを付けたいのですが、あなたが言ったことを質問してくれますか#Joe C –

答えて

0

を取得するために、ランダムな番号と名前を結合したい

select name,rank() over (order by name asc) as rank, 
ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber] 
from Student 

あなただけではなくrow_number()を使用してのrank()で乱数を使用したい理由を私は知りませんが、それが行きますこのような何か:

rextester:http://rextester.com/OLKI98516

create table student(
    id int not null identity(1,1) primary key 
    , name varchar(255) not null 
); 
insert into student values 
('Santosh'),('Kumar'),('Reddy'),('Badugula'),('SqlZim') 
,('Emma'),('Xandra'),('Naida'),('Daria'),('Colby'),('Yetta') 
,('Zena'),('Deacon'),('Francis'),('Lilah'),('Risa'),('Lee') 
,('Vanna'),('Molly'),('Destiny'),('Tallulah'),('Meghan') 
,('Deacon'),('Francis'),('Daria'),('Colby'); 

select 
    name 
    , RandomNumber = abs(cast(cast(newid() as varbinary) as int)) 
    , Name_w_RandomNumber = concat(name, '_', abs(cast(cast(newid() as varbinary) as int))) 
    , rank = rank() over (order by name asc) 
    , row_number = row_number() over (order by name asc) 
    , rank_w_Rand = rank() over (order by name,abs(cast(cast(newid() as varbinary) as int)) asc) 
from student 

結果:

+----------+--------------+---------------------+------+------------+-------------+ 
| name | RandomNumber | Name_w_RandomNumber | rank | row_number | rank_w_Rand | 
+----------+--------------+---------------------+------+------------+-------------+ 
| Badugula | 1105357025 | Badugula_1036749632 | 1 |   1 |   1 | 
| Colby | 1125329440 | Colby_1442709274 | 2 |   2 |   2 | 
| Colby | 1891932149 | Colby_1045919975 | 2 |   3 |   3 | 
| Daria | 1494409363 | Daria_112566484  | 4 |   4 |   4 | 
| Daria | 666341314 | Daria_262264162  | 4 |   5 |   5 | 
| Deacon | 1530588472 | Deacon_1783529467 | 6 |   6 |   6 | 
| Deacon | 350443065 | Deacon_1150932866 | 6 |   7 |   7 | 
| Destiny | 2007923301 | Destiny_793747374 | 8 |   8 |   8 | 
| Emma  | 435476101 | Emma_659930976  | 9 |   9 |   9 | 
| Francis | 1638790395 | Francis_2132056162 | 10 |   10 |   10 | 
| Francis | 793873129 | Francis_756254272 | 10 |   11 |   11 | 
| Kumar |  20071275 | Kumar_2007808448 | 12 |   12 |   12 | 
| Lee  | 2069120264 | Lee_837143565  | 13 |   13 |   13 | 
| Lilah | 1319087807 | Lilah_605243166  | 14 |   14 |   14 | 
| Meghan | 487733175 | Meghan_1884481541 | 15 |   15 |   15 | 
| Molly | 2086860257 | Molly_1914281986 | 16 |   16 |   16 | 
| Naida | 169335218 | Naida_719205571  | 17 |   17 |   17 | 
| Reddy | 528578158 | Reddy_1297094295 | 18 |   18 |   18 | 
| Risa  | 1826403411 | Risa_1530611023  | 19 |   19 |   19 | 
| Santosh | 723134579 | Santosh_487617337 | 20 |   20 |   20 | 
| SqlZim | 937324776 | SqlZim_738072767 | 21 |   21 |   21 | 
| Tallulah | 521881065 | Tallulah_1717653898 | 22 |   22 |   22 | 
| Vanna | 1508284361 | Vanna_1620612208 | 23 |   23 |   23 | 
| Xandra | 532483290 | Xandra_493053714 | 24 |   24 |   24 | 
| Yetta | 1735945301 | Yetta_1548495144 | 25 |   25 |   25 | 
| Zena  | 311372084 | Zena_1429570716  | 26 |   26 |   26 | 
+----------+--------------+---------------------+------+------------+-------------+ 
+0

あなたの行番号は名前だけに基づいています、OPは名前が等しいときramdomnessを求めました。 –

+0

@joeCこれは、要求された 'rank_w_Rand'結果の下に含まれています。 – SqlZim

0

ここでは、私がコメントしていたクエリですが、かなり機能的ではありません。あなたがここに尋ねたのは、私が正しいとすれば、それを実行するたびに違う結果を得るたびに自分自身をランダムな値にすることは決してありません。

select name, 
     rank() over (order by name, 
      ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT))) asc) as rank 
from Student 

EDIT:CTEが乱数を表示するようにして、それはまだABSを使用しているとき、あなたはそれを検討する必要があるでしょうになる場合、NEWID()は必ずユニークではなく、保証されています。

with cteQry As 
( select name, ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT))) NewIdVal 
    from Student 
) 
    select name, NewIdVal, 
      rank() over (order by name, NewIdVal asc) as rank 
    from cteQry 
+0

'convert()'と 'rank()'を連結する必要はありません。カンマで区切るだけで、 'order by'で適切に順序付けされます。 – SqlZim

+0

良い点私は更新する –

+0

'ccode'はおそらく' order by'の 'name'であるべきです – SqlZim

関連する問題