Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL Server中从行号中选择top X?_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 如何在SQL Server中从行号中选择top X?

Sql server 如何在SQL Server中从行号中选择top X?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个数据样本,现在我想使用TOP XcombineROW\u NUMBER() 在本例中,我希望获得数据,在运行SQL语句之后,结果如下 IndexNo ProductName 3 Brown 4 Green 5 Red 我在这种情况下使用此sql语句,但我得到了一个错误无效列名'IndexNo',这是sql语句 SELECT TOP 3 ROW_NUMBER() OVER(ORDER BY TEMPA.ProductName) AS IndexNo,

我有一个数据样本,现在我想使用
TOP X
combine
ROW\u NUMBER()

在本例中,我希望获得数据,在运行SQL语句之后,结果如下

IndexNo ProductName
3       Brown
4       Green
5       Red
我在这种情况下使用此sql语句,但我得到了一个错误
无效列名'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

您需要将您的
行号
包装到公共表表达式中,并在外层应用
介于
之间:

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

您可以使用另一层带括号的子查询

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

您需要在一个作用域中创建
行编号()
,并在另一个作用域中筛选它

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

这与
TOP
ORDER BY
不同,因为它们在
SELECT
WHERE
子句之后应用

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

这在使用
orderby?抵消?取回?
而不是
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.

在您的示例中,您还使用了
DISTINCT
,它是在计算
SELECT
值之后应用的,但是您可以使用
groupby
,因为它是在计算
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
  • 首先是
    FROM
    子句中的所有联接(在您的情况下不做任何事情)
  • 应用
    WHERE
    子句
  • 应用
    分组依据
    条款(与您的不同条款具有相同的效果)
  • 计算
    选择
    值,包括
    行号()
  • 应用
    ORDER BY
    ,包括
    OFFSET
    FETCH NEXT
    子句
  • 您想要的一切,无需在子查询中下一步执行任何操作

    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