sql row_number() 与 select row_number() 获取数据

标签 sql sql-server rowcount partition-by

我有下表

Prod_id   Units sold
 1,       100 
 2,       95 
 3,       84 
 4,       95 
 5,       100 

我想知道为什么第一个查询给出正确的行数,而第二个查询仅返回 1

select 
 (ROW_NUMBER() OVER (Partition by amount order by id)) 
from Products 


select *, 
(select ROW_NUMBER() OVER (Partition by amount order by id) a )  
from Products 

结果在这里:http://sqlfiddle.com/#!6/dfd59/11

我想用它来应用 100、100 1st 和 5th rows 和 95、95 到此查询中的第 2 行和第 4 行 不使用 with 语句。 如果有办法请告诉我

最佳答案

编写没有 from 子句的子查询是对子查询的浪费。它没有做任何令人满意的事情。

直接调用函数即可。

注意:此建议适用于子查询中的任何表达式,而不仅仅是row_number()

为什么你的子查询只返回“1”?这个原因解释起来相当微妙。但是,想象一下子查询被写成:

select *, 
       (select ROW_NUMBER() OVER (Partition by amount order by id) a
        from dual)  

事实上,这就是在多个 SQL 数据库中可以或将会编写查询的方式。 dual 是只有一行的表格。这个小事实强调了正在发生的事情。子查询指一次一行。因此,您获得的 row_number() 仅指按该行进行分区。瞧!您只能得到“1”。

我意识到,如果您将子查询视为:

,这可能会有所帮助
select *, 
       (select ROW_NUMBER() OVER (Partition by amount order by id) a
        from (select products.amount, products.id) p
       )  

这强调了 row_number() 正在应用于子选择的结果集。根据定义,该子选择只有一行,这会导致返回“1”。

关于sql row_number() 与 select row_number() 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48349361/

相关文章:

mysql - 查询一对多表,其中多方至少有一行

mySQL - 如何切换列值 - 'short' 到 'long' 和 'long' 到 'short'

sql-server - SSIS发送邮件文件附件失败

sql-server - 当列 "createdDate"从现在起经过 90 天时,如何更新具有数百万行的 SQL Server 表中的列?我们可以使用触发器吗?

sql-server - VBA - SQL 查询字符串

php - 使用百分比选择获取行号的最快方法(LIMIT X,1)?

php - PDO:使用 rowCount 确定数据库中的表数?

mysql - 显示每个用户的操作数,按操作 ID 分组

sql - 如何从 unix 终端连接到 Microsoft SQL Server 数据库?我必须连接 SQL Server 2008 数据库

sql - 为什么我无法获取@@rowcount 值?