2017-12-30 5 views
1

Ich habe eine Datenprobe, und jetzt möchte ich Daten erhalten TOP XROW_NUMBER()Wie wählt man Top X aus einer Zeilennummer in SQL Server?

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

Wie in diesem Fall folgen kombinieren mit, ich möchte die Daten erhalten, die nach der SQL-Anweisung ausführen, das Ergebnis als

IndexNo ProductName 
3  Brown 
4  Green 
5  Red 

Ich benutze diese SQL-Anweisung für diesen Fall, aber ich bekomme diesen Fehler Invalid column name 'IndexNo', das ist SQL-Anweisung.

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 

Antwort

1

Sie könnten eine andere Ebene der Unterabfrage mit Klammern verwenden.

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

Sie benötigen ROW_NUMBER in Common Table Expression wickeln und between auf der äußeren Ebene gelten:

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

Sie müssen die ROW_NUMBER() in einem Rahmen schaffen und es in einem anderen Rahmen filtern ...

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


Dies ist die NICHT gleich für TOP und ORDER BY, da diese nach den SELECT und WHERE Klauseln angewandt werden, so würde dies funktionieren ...

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


Dies vor allem, um Ihren Fall nützlich ist, wenn ORDER BY ? OFFSET ? FETCH ? statt TOP mit .

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. 


In Ihrem Beispiel sind Sie auch DISTINCT verwendet, die angewendet wird nach die SELECT Werte berechnet werden, aber man konnte Verwendung GROUP BY statt, wie es angewendet wird vor werden die SELECT Werte berechnet.

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. Alle verbindet die in der FROM Klausel erste (nichts in Ihrem Fall zu tun)
  2. Übernehmen Sie die WHERE Klausel
  3. Übernehmen Sie die GROUP BY Klausel (gleiche Wirkung wie Ihr DISTINCT)
  4. Berechnen Sie die SELECT Werte, einschließlich der ROW_NUMBER()
  5. Übernehmen Sie die ORDER BY einschließlich der OFFSET und FETCH NEXT Klauseln

Alles, was Sie, ohne dass zum nächsten etwas in Unterabfragen wollte.

Verwandte Themen