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
combineROW\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