gpt4 book ai didi

sql - 为什么 where 子句中没有窗口函数?

转载 作者:行者123 更新时间:2023-12-01 18:06:13 25 4
gpt4 key购买 nike

标题说明了一切,为什么我不能在 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)

但是这不起作用。有没有比 CTE/子查询更好的方法?

编辑

就其值(value)而言,这是带有 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

编辑

+1 对于使用子查询显示的答案,但实际上我正在寻找无法在 where 子句中使用窗口函数的原因。

最佳答案

why can't I use a windowed function in a where clause in SQL Server?

一个答案虽然不是特别有用,但因为规范说你不能。

请参阅 Itzik Ben Gan 的文章 - Logical Query Processing: What It Is And What It Means to You特别是the image here 。窗口函数在 SELECT 时评估在 WHERE 之后剩余的结果集上/JOIN/GROUP BY/HAVING条款已处理(步骤 5.1)。

really I'm looking for the reasoning behind not being able to use windowing functions in where clauses.

WHERE 中不允许使用它们的原因的条款是它会造成歧义。窃取 Itzik Ben Gan 的例子 High-Performance T-SQL Using Window Functions (第25页)

假设你的 table 是

CREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)

INSERT INTO T1 VALUES('A'),('B'),('C'),('D'),('E'),('F')

以及您的查询

SELECT col1
FROM T1
WHERE ROW_NUMBER() OVER (ORDER BY col1) <= 3
AND col1 > 'B'

正确的结果是什么?您是否期望 col1 > 'B'谓词在行编号之前还是之后运行?

关于sql - 为什么 where 子句中没有窗口函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13997177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com