Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 复杂日期谓词用法_Sql Server_Tsql - Fatal编程技术网

Sql server 复杂日期谓词用法

Sql server 复杂日期谓词用法,sql-server,tsql,Sql Server,Tsql,我试图根据表中最长日期和最长日期前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

我试图根据表中最长日期和最长日期前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.

我不明白为什么。请有人告诉我为什么会出现此错误,并建议实现目标的方法?

您不能在
where
子句中使用聚合函数。最好的方法可能是将逻辑放入来自的

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;

以前的版本可能效率更高,但值得测试这两个版本。

为什么您认为这比使用CTE更好?@Hogan。就性能而言,它们应该是一样的。这也是我的想法,但你说“可能是最好的方式…”所以我希望学习一些新的东西。我可以问一下,为什么要交叉连接吗?@BubbleandSqueak cross-join如果他只是说“连接”也会做同样的事情,那几乎就是风格。由于子查询中只有一个项,它会将该项添加到每一行中——作为交叉联接或联接。