我正在尝试根据表格中最大日期和最长日期之前的20天窗口之间的记录来过滤我的结果。
我想出了以下代码: -
SELECT orderid, custid, empid, shipperid, orderdate, filler
FROM dbo.Orders
WHERE orderid BETWEEN min(max(orderdate)-DATEADD(day,20,orderdate)) AND max(orderdate)
order by orderid
这会产生以下错误: -
Msg 130, Level 15, State 1, Line 226
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
我无法理解为什么。请有人让我知道为什么我会收到这个错误并提出一种方法来实现我的目标吗?
答案 0 :(得分:0)
您不能在where
子句中使用聚合函数。可能最好的方法是将逻辑放在from
:
select o.*
from dbo.Orders o cross join
(select max(orderdate) as maxorderdate from orders) omax
where o.orderdate between dateadd(day, -20, omax.maxorderdate) and omax.maxorderdate
order by orderid;
编辑:
另一种方法是:
select o.*
from (select o.*, max(orderdate) over () as maxorderdate
from dbo.orders o
) o
where orderdate between dateadd(day, -20, maxorderdate) and maxorderdate
order by orderid;
以前的版本可能更有效,但值得测试这两个版本。