2017-12-30 18 views
1

私は、データサンプルを持っている、そして今私はSQL ServerのRow_numberからトップXを選択するにはどうすればよいですか?

その結果、

IndexNo ProductName 
1  Black 
2  Blue 
3  Brown 
4  Green 
5  Red 
6  White 
7  Yellow 

としては、この場合には従ってROW_NUMBER()が、私は後のSQL文を実行したデータを、取得したい組み合わせTOP Xを使用してデータを取得したいです

IndexNo ProductName 
3  Brown 
4  Green 
5  Red 

この場合、このSQL文を使用しますが、このエラーはInvalid column name 'IndexNo'です。これはSQL文です。

SELECT TOP 3 ROW_NUMBER() OVER(ORDER BY TEMPA.ProductName) AS IndexNo, TEMPA.ProductName 
FROM (
      SELECT DISTINCT ProductName FROM PRODUCTS WHERE ProductType ='Food' 
) AS TEMPA 
WHERE IndexNo between 3 and 5 

答えて

1

あなたは括弧でサブクエリの別のレベルを使用することができます。

SELECT TOP 3 * FROM 
(SELECT ROW_NUMBER() OVER(ORDER BY TEMPA.ProductName) AS IndexNo, TEMPA.ProductName 
FROM (
      SELECT DISTINCT ProductName FROM PRODUCTS 
) AS TEMPA 
) as TEMPB 
WHERE IndexNo between 3 and 5 

DEMO

1

あなたは、共通テーブル式にあなたのROW_NUMBERをラップし、外側のレベルにbetweenを適用する必要があります。

with cte as (
SELECT ROW_NUMBER() OVER(ORDER BY TEMPA.ProductName) AS IndexNo, TEMPA.ProductName 
FROM (
      SELECT DISTINCT ProductName FROM PRODUCTS WHERE ProductType ='Food' 
) AS TEMPA 
) select top 3 * from cte 
WHERE cte.IndexNo between 3 and 5 
0
あなたは ROW_NUMBER() 1でスコープを作成し、別のスコープでそれをフィルタリングする必要が

...

SELECT 
    * 
FROM 
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY x) AS ix FROM example 
) 
    indexed_example 
WHERE 
    ix BETWEEN 3 AND 5 


これはませですTOPおよびについても同じ、これらはSELECTWHERE条項を適用しているので、これは正常に動作と同じように...

SELECT TOP(3) 
    *, 
    ROW_NUMBER() OVER (ORDER BY id DESC) ix 
FROM 
    example 
ORDER BY 
    ix 


ORDER BY ? OFFSET ? FETCH ?代わりのTOPを使用する場合は、あなたの場合に特に便利です。あなたの例では

SELECT 
    *, 
    ROW_NUMBER() OVER (ORDER BY id DESC) ix 
FROM 
    example 
ORDER BY 
    ix DESC 
    OFFSET 2 ROWS   -- Skip 2 rows 
    FETCH NEXT 3 ROWS ONLY -- Fetch the 3rd, 4th and 5th rows. 


、あなたはまた、SELECT値が計算されて適用されるDISTINCTを使用しているが、それは、を適用しているとして、あなた代わりGROUP BYを使用することができますの前には、SELECTの値が計算されます。

SELECT 
    ROW_NUMBER() OVER (ORDER BY Products.ProductName) ix, 
    Products.ProductName 
FROM 
    Products 
WHERE 
    Products.ProductType = 'Food' 
GROUP BY 
    Products.ProductName 
ORDER BY 
    ix DESC 
    OFFSET 2 ROWS 
    FETCH NEXT 3 ROWS ONLY 
  1. すべて(あなたのケースでは何の関係も)最初FROM句に参加し
  2. WHERE
  3. GROUP BY(あなたDISTINCTと同じ効果)を適用します
  4. を含む SELECTの値を計算します。 210
  5. は、サブクエリの次は何もしなくても、

すべてはあなたが望んでいたOFFSETFETCH NEXT条項を含むORDER BYを適用します。

関連する問題