sql row_number()vs select row_number()来获取数据

时间:2018-01-19 20:51:21

标签: 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第1和第5 此查询中的行和95,95到第2行和第4行 不使用with语句。 如果有办法,请告诉我

1 个答案:

答案 0 :(得分:2)

编写没有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”。