繁体   English   中英

LAG 可以与 HAVING 一起使用吗?

[英]Can LAG be used with HAVING?

我清楚地记得 T-SQL 永远不会让你混合LAGWHERE 例如,

SELECT FOO
WHERE LAG(BAR) OVER (ORDER BY DATE) > 7

永远不会工作。 无论您做什么,T-SQL 都不会运行它。 但是 T-SQL 是否曾经让您将LAGHAVING混合在一起?

注意:答案需要做的就是给出一个基于理论或基于文档的原因,或者给出任何例子。

SELECT 语句的逻辑处理顺序

以下步骤显示了 SELECT 语句的逻辑处理顺序或绑定顺序......

  1. 加入
  2. 在哪里
  3. 通过...分组
  4. WITH CUBE 或 WITH ROLLUP
  5. 拥有
  6. SELECT
  7. 清楚的
  8. 订购方式
  9. 最佳

Window 函数在SELECT级别进行评估,在HAVING之后,所以答案是否定的,你不能在HAVING子句中使用 window 函数。

Having子句只能与Group by子句一起使用。 为了使用Group by列出的列,应使用Group by列进行聚合。 Group by只能与min,max,sum,count函数等聚合函数一起使用。 因此,不可能将having子句与LAG分析 function 结合起来。

为了使用LAGHaving ,应该使用 CTE 或子查询。

可以在同一级别对窗口化 function 进行过滤,但需要 SQL 服务器不支持的语言扩展 (QUALIFY)。

资格

在 SELECT 语句中,QUALIFY 子句过滤 window 函数的结果。

QUALIFY 对 window 函数的作用与 HAVING 对聚合函数和 GROUP BY 子句的作用相同。

样本:

CREATE TABLE tab(FOO STRING, BAR INT, DATE DATE);

INSERT INTO TAB(FOO, BAR, DATE)
VALUES ('a', 1, '2021-02-10'), ('b', 10, '2021-02-11'),
       ('c', 11, '2021-02-12'), ('d', 12, '2021-02-12');

SELECT *
FROM TAB
QUALIFY LAG(BAR) OVER (ORDER BY DATE) > 7;

在此处输入图像描述


相关:为什么 where 子句中没有窗口函数?

Lukas Eder 的 SQL 操作的真正顺序初学者指南

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM