sql - 维蒂卡。子查询和外部查询分组中 HAVING 子句中当前时间的 GROUPING()

标签 sql group-by vertica

我尝试执行以下查询,但收到错误:

SELECT * FROM (
  SELECT
    DATEDIFF('year', event_timestamp, NOW())
  FROM 
    events
  GROUP BY CUBE(
    DATEDIFF('year', event_timestamp, NOW())
  )
  HAVING GROUPING(
    DATEDIFF('year', event_timestamp, NOW())
  ) = 0
) AS subqueries GROUP BY 1;

查询看起来很奇怪,因为它只是 MCVE 。真实查询由外部查询分组下的多个子查询组成,并且在HAVING子句中具有更复杂的条件。

[42803][7182] [Vertica]VJDBC ERROR: Grouping function arguments need to be group by expressions

但是正如您所看到的,GROUPING() 参数与 CUBE()SELECT 子句相同。

如果 NOW() 函数被替换为某个固定值,则查询效果良好:

SELECT * FROM (
  SELECT
    DATEDIFF('year', event_timestamp, '2018-01-01 00:00:00')
  FROM 
    events
  GROUP BY CUBE(
    DATEDIFF('year', event_timestamp, '2018-01-01 00:00:00')
  )
  HAVING GROUPING(
    DATEDIFF('year', event_timestamp, '2018-01-01 00:00:00')
  ) = 0
) AS subqueries GROUP BY 1;
-- ok

是否禁止使用 NOW() 因为它可以为查询执行的不同部分返回不同的值(即当 GROUP BYHAVING 时) > 将被实际处理)?
如果这是真的,那么为什么对基本查询进行以下修改也可以使其工作,而不管使用 NOW():

仅外部查询之外未修改的子查询:

SELECT
  DATEDIFF('year', event_timestamp, NOW())
FROM 
  events
GROUP BY CUBE(
  DATEDIFF('year', event_timestamp, NOW())
)
HAVING GROUPING(
  DATEDIFF('year', event_timestamp, NOW())
) = 0
-- ok

不带 GROUP BY 子句的外部查询:

SELECT * FROM (
  SELECT
    DATEDIFF('year', event_timestamp, NOW())
  FROM 
    events
  GROUP BY CUBE(
    DATEDIFF('year', event_timestamp, NOW())
  )
  HAVING GROUPING(
    DATEDIFF('year', event_timestamp, NOW())
  ) = 0
) AS subqueries;
-- ok

我可以通过在应用程序端获取当前时间来解决该问题,但我只想了解该问题。我是否错过了一些有关 SQL 的基础知识,或者它是 Vertica 的边缘情况?

Vertica版本:8.1


更新 2018-07-04:该错误已在 Vertica 8.1.1-20 中修复(请参阅 this comment)。

最佳答案

您可以尝试:

SELECT * FROM (
  SELECT 
    DATEDIFF('year', event_timestamp, (select now()))
  FROM 
    events
  GROUP BY CUBE(
    DATEDIFF('year', event_timestamp, (select now()))
  )
  HAVING GROUPING(
    DATEDIFF('year', event_timestamp, (select now()))
  ) = 0
) AS subqueries GROUP BY 1;

NOW() 被视为稳定函数:它将在同一事务中的后续调用中返回完全相同的值。

更新

此解决方法在大多数情况下都很好,但在某些情况下会导致 Vertica 的内部错误。 请参阅Vertica论坛上的相关讨论:https://forum.vertica.com/discussion/239469/

关于sql - 维蒂卡。子查询和外部查询分组中 HAVING 子句中当前时间的 GROUPING(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48869357/

相关文章:

mysql - 选择最近的值与其中

sql - 使用 FIRST_VALUE 而不包括 group by 中的内部列

sql - 计算来自多列的不同值

mysql - SQL选择用户的唯一列表,以及其他数据取决于时间戳

sql - Postgres Select语句的列不存在

Linq:带有分组、具有和最大的查询

sql - 优化 Vertica SQL 查询以进行运行总计

python-3.x - 如何使用 ODBC 连接 python 和 vertica?

sql - 在 SQL 中查找某些行值的公共(public)行

SQLite - SELECT TOP 语法错误