我想用它ROW_NUMBER()来...
max(ROW_NUMBER())- >或者我猜这也是所有行的计数我试过做:
SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users
Run Code Online (Sandbox Code Playgroud)
但它似乎没有工作......
ROW_NUMBER()使用给定的资料片,即得.如果我有一个名字,我想知道名字来自哪一行.我认为这将类似于我为#1尝试的东西
SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName='Joe'
Run Code Online (Sandbox Code Playgroud)
但这也不起作用......
有任何想法吗?
标题说明了这一点,为什么我不能在SQL Server的where子句中使用窗口函数?
这个查询很有意义:
select id, sales_person_id, product_type, product_id, sale_amount
from Sales_Log
where 1 = row_number() over(partition by sales_person_id, product_type, product_id order by sale_amount desc)
Run Code Online (Sandbox Code Playgroud)
但它不起作用.有没有比CTE /子查询更好的方法?
编辑
值得一提的是CTE的查询:
with Best_Sales as (
select id, sales_person_id, product_type, product_id, sale_amount, row_number() over (partition by sales_person_id, product_type, product_id order by sales_amount desc) rank
from Sales_log
)
select id, sales_person_id, product_type, product_id, sale_amount
from Best_Sales
where rank = 1
Run Code Online (Sandbox Code Playgroud)
编辑
用子查询显示答案的+1,但实际上我正在寻找无法在where子句中使用窗口函数的原因.
假设我正在使用Northwind数据库,并且我希望通过包含以下参数的存储过程运行查询:
@Offset 指示分页开始的位置,@Limit 表示页面大小,@SortColumn 表示用于分类目的的列,@SortDirection,表示上升或后代排序.我的想法是对数据库进行分页,因为结果集包含数千行,因此缓存不是一个选项(并且使用VIEWSTATE甚至不被视为IMO,很糟糕).
您可能知道SQL Server 2005提供了函数ROW_NUMBER,它返回结果集的分区中的行的序号,从1开始,每个分区的第一行.
我们需要对每个返回的列进行排序(本例中为5),动态SQL不是一个选项,因此我们有两种可能:使用大量的IF ... ELSE ...10个查询,这是一个难以维护的地狱,或者具有如下查询:
WITH PaginatedOrders AS (
SELECT
CASE (@SortColumn + ':' + @SortDirection)
WHEN 'OrderID:A' THEN ROW_NUMBER() OVER (ORDER BY Orders.OrderID ASC)
WHEN 'OrderID:D' THEN ROW_NUMBER() OVER (ORDER BY Orders.OrderID DESC)
WHEN 'CustomerID:A' THEN ROW_NUMBER() OVER (ORDER BY Orders.CustomerID ASC)
WHEN 'CustomerID:D' THEN ROW_NUMBER() OVER (ORDER BY Orders.CustomerID DESC)
WHEN 'EmployeeID:A' THEN ROW_NUMBER() OVER (ORDER BY Orders.EmployeeID ASC)
WHEN …Run Code Online (Sandbox Code Playgroud) 在 T-SQL 中,我想通过逐行读取来循环访问存储过程中的表。
DECLARE @IMAX INT,
@ICOUNT INT,
@INTERFACE_ID_36 INT,
@INTERFACE_ID_38 INT
SELECT * FROM INTERFACE_36_DATA
SET @IMAX = @@ROWCOUNT
SET @ICOUNT = 1
WHILE(@ICOUNT <= @IMAX)
BEGIN
SELECT @INTERFACE_ID_36 = Interface_ID
FROM INTERFACE_36_DATA
WHERE ROW_NUMBER() OVER (ORDER BY id) AS = @ICOUNT --syntax error here
IF @INTERFACE_ID_36 = 10
SET @INTERFACE_ID_38 = 0
ELSE IF @INTERFACE_ID_36 =
Run Code Online (Sandbox Code Playgroud)