【问题标题】:Problem when using HAVING with aliases in MySQL在 MySQL 中使用带有别名的 HAVING 时出现问题
【发布时间】:2021-09-08 13:32:52
【问题描述】:

我有一个 MySQL 数据库,其中包含一个包含日期列表的表。我需要在该表的空白处找到第一天和最后一天。它们是某些员工在过去 30 天内的休假天数。我正在使用:

Select DATE, 
       LEAD(DATE,1) over(ORDER BY DATE DESC) AS PREVDATE,
       datediff(DATE,LEAD(DATE,1) over(ORDER BY DATE DESC)) AS GAP
       from DAYSWORKED 
       DATE>date_sub(CURRENT_DATE, interval 30 DAY)
       having GAP>1;

如果我在没有 HAVING 子句的情况下运行代码,我会得到一个日期和以前日期的列表,以及 GAP>1 的点是我休假的点,但是我包含子句 HAVING 来过滤这些点它不起作用。

我做错了什么?

感谢您的帮助!!!

【问题讨论】:

  • it doesn't work ...您收到的确切错误消息是什么?您的查询缺少WHERE 子句,但这可能只是一个复制错误。
  • 请显示您的实际查询并解释“它不起作用”的意思; 会发生什么?还请编辑您的问题以显示show create table DAYSWORKED 的输出(作为文本,而不是图像)以及一些示例数据的插入语句以及该示例数据的期望和实际结果,以证明问题
  • GAP 列包含 HAVING 子句中不允许的窗口函数,即使是隐式的。因为它会影响输出行集,因此它会影响在 HAVING 和 ORDER BY 之间获得的窗口函数(自身)结果。

标签: mysql where-clause alias having lead


【解决方案1】:

您需要子查询才能访问 GAP 别名。此外,您需要一个正确的WHERE 子句,它以“where”一词开头。

WITH cte AS (
    SELECT DATE,
           LEAD(DATE) OVER (ORDER BY DATE DESC) AS PREVDATE,
           DATEDIFF(DATE, LEAD(DATE) OVER (ORDER BY DATE DESC)) AS GAP
    FROM DAYSWORKED
    WHERE DATE > DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)
)

SELECT *
FROM cte
WHERE GAP > 1;

【讨论】:

  • 您可以使用having子句中的别名。他们还有其他问题
  • @ysth 我认为你是对的。我已要求 OP 进行澄清。我的回答至少应该仍然有效,但我会在看到更多信息后删除。
  • 我现在想知道是否可以在 HAVING 子句中使用包含分析函数调用的别名。
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 2020-07-03
  • 1970-01-01
  • 2013-10-22
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多