web-dev-qa-db-ja.com

ROW_NUMBER()はどうやって使うのですか?

取得するためにROW_NUMBER()を使いたいのですが….

  1. max(ROW_NUMBER()) - >を取得するには、これはすべての行の数でもあると思います

私がやってみました:

SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users

しかしうまくいかなかったようですが….

  1. 与えられた情報を使ってROW_NUMBER()を取得すること。名前があり、その名前がどの行から来たのか知りたい場合。

私はそれが私が#1のために試みたものに類似するものであると思います

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'

しかし、これもうまくいきませんでした...

何か案は?

153
Matt

最初の質問では、なぜ使わないのですか?

SELECT COUNT(*) FROM myTable 

カウントを取得します。

そして2番目の質問では、行の主キーは特定の行を識別するために使用されるべきものです。そのために行番号を使用しないでください。


メインクエリでRow_Number()を返した場合は、

SELECT ROW_NUMBER() OVER (Order by Id) AS RowNumber, Field1, Field2, Field3
FROM User

その後、5行戻りたい場合は、現在の行番号を取得し、次のクエリを使用してcurrentrow -5で行を決定できます。

SELECT us.Id
FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS Row, Id
     FROM User ) us 
WHERE Row = CurrentRow - 5   
133
Darrel Miller

総行数を取得するためにcount()を使用することができると私は他の人に同意しますが、これがrow_count()の使用方法です。

  1. 合計行数を取得するには、次の手順を実行します。

    with temp as (
        select row_number() over (order by id) as rownum
        from table_name 
    )
    select max(rownum) from temp
  2. NameがMattの行番号を取得するには、次のようにします。

    with temp as (
        select name, row_number() over (order by id) as rownum
        from table_name
    )
    select rownum from temp where name like 'Matt'

さらにmin(rownum)またはmax(rownum)を使用して、それぞれMattの最初の行または最後の行を取得できます。

これらはrow_number()の非常に単純な実装でした。より複雑なグループ化に使用できます。サブクエリを使用せずに 高度なグループ化に関する私の回答をチェックしてください

40
Rashmi Pandit

テーブルの合計行数を返す必要がある場合は、SELECT COUNT(*)ステートメントの代わりの方法を使用できます。

SELECT COUNT(*)はテーブル全体をスキャンして行数を返すので、大きなテーブルでは非常に長い時間がかかります。この場合は代わりにsysindexesシステムテーブルを使用できます。データベースの各テーブルの合計行数を含むROWS列があります。次のSELECT文を使用できます。

SELECT rows FROM sysindexes WHERE id = OBJECT_ID('table_name') AND indid < 2

これにより、クエリにかかる時間が大幅に短縮されます。

24
Muhammad Akhtar

ROW_NUMBER()は、1から始まる各行に固有の番号を返します。これを書くだけで簡単に使用できます。

ROW_NUMBER() OVER (ORDER BY 'Column_Name' DESC) as ROW_NUMBER

Row_number()Rank()Dense_Rank()の違いはこちら でご覧になれます。

7
Jatin Phulera
SELECT num, UserName FROM 
 (SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
  From Users) AS numbered
WHERE UserName='Joe'
4
Alex Martelli

これを使って最初のレコードを取得しますwhere where句

SELECT TOP(1) * , ROW_NUMBER() OVER(ORDER BY UserId) AS rownum 
FROM     Users 
WHERE    UserName = 'Joe'
ORDER BY rownum ASC
3
Omid Farvid

ここでの質問とは関係ないかもしれません。 ROW_NUMBERを使うときに便利だと思いました -

SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Any_ID 
FROM #Any_Table
3
Jyo
select 
  Ml.Hid,
  ml.blockid,
  row_number() over (partition by ml.blockid order by Ml.Hid desc) as rownumber,
  H.HNAME 
from MIT_LeadBechmarkHamletwise ML
join [MT.HAMLE] h on ML.Hid=h.HID
3
Hari Lakkakula

指定されたQueryで言及されているWITH table ASを使用して仮想テーブルを作成する必要があります。

この仮想テーブルを使用すると、CRUD操作w.r.t row_numberを実行できます。

質問:

WITH table AS
-
(SELECT row_number() OVER(ORDER BY UserId) rn, * FROM Users)
-
SELECT * FROM table WHERE UserName='Joe'
-

INSERTにかかわらず、最後の文にUPDATEDELETE、またはSELECTを使用できます。

2
Gaurav Chutke

クエリ結果を制限するためにRow_Numberを使用できます。

例:

SELECT * FROM (
    select row_number() OVER (order by createtime desc) AS ROWINDEX,* 
    from TABLENAME ) TB
WHERE TB.ROWINDEX between 0 and 10

- 上記のクエリで、TABLENAMEから結果のPAGE 1を取得します。

2
Johnson Pham

Count(*)の代わりにROW_NUMBERを絶対に使用したい場合は、いつでも使用できます。

SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)   
FROM USERS  
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC
2
Richard S

SQL Row_Number()関数 は、関連レコードセットのデータ行に順序番号をソートして割り当てるためのものです。そのため、行の番号付けに使用されます。たとえば、注文金額が最も多い上位10行を特定したり、各顧客の注文数が最も多い行を特定するなどです。

データセットを並べ替えてカテゴリに分類して各行に番号を付ける場合は、Row_Number()とPartition By句を使用します。たとえば、データセットにすべての注文が含まれている場合に、各顧客の注文を自分自身内でソートするなどです。

SELECT
    SalesOrderNumber,
    CustomerId,
    SubTotal,
    ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY SubTotal DESC) rn
FROM Sales.SalesOrderHeader

しかし、私が理解しているように、あなたは列によってグループ化されたの行数を計算したいと思います。要件を視覚化するために、関連顧客のすべての注文数を注文情報とは別の列として表示する場合は、 COUNT()集計関数とPartition By句を使用できます

例えば、

SELECT
    SalesOrderNumber,
    CustomerId,
    COUNT(*) OVER (PARTITION BY CustomerId) CustomerOrderCount
FROM Sales.SalesOrderHeader
0
Eralper

このクエリ:

SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'

UserName'Joe'であるすべての行を返しますUserName='Joe'がない場合

それらはUserIDの順にリストされ、row_numberフィールドは1から始まりインクリメントされますが、多くの行にUserName='Joe'が含まれます。

うまくいかない場合は、WHEREコマンドに問題がありますORテーブルにUserIDがありません。両方のフィールドUserIDUserNameのスペルをチェックしてください。

0
Clark Vera