【问题标题】:sql row_number() vs select row_number() to get datasql row_number() vs select row_number() 获取数据
【发布时间】:2018-01-19 20:51:21
【问题描述】:

我有下表

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

【问题讨论】:

  • 不要写成子查询,而是写成表达式
  • 你能分享一个例子吗?
  • select *, ROW_NUMBER() OVER (Partition by amount order by id) a from Products
  • 使用您的第一个查询,将 row_Number 窗口函数从括号中取出,它们只会添加噪音。然后添加您想要的其他列。
  • 在您的第一个查询中,Row_Number() 被评估为一个表达式;在您的第二个中,它是子查询的一部分,该子查询在 Products 中的每一行执行一次。由于子查询每次执行时只有一行,所以它总是返回 1

标签: sql sql-server rowcount partition-by


【解决方案1】:

编写没有from 子句的子查询是对子查询的浪费。它没有做任何可取的事情。

直接调用函数即可。

注意:此建议适用于子查询中的 any 表达式,而不仅仅是 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”。

【讨论】:

    猜你喜欢
    • 2014-09-16
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多