垂直。 GROUPING() on current time in HAVING clause in subquery and outer query grouping
Vertica. GROUPING() on current time in HAVING clause in subquery and outer query grouping
我正在尝试执行以下查询,但出现错误:
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()
因为它可以 return 查询执行的不同部分的不同值(即当 GROUP BY
和 HAVING
将被实际处理时) ?
如果它是真的,那么为什么对基本查询 的以下修改也可以使它工作,无论使用 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 的边缘案例?
垂直版本: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() 被认为是一个 STABLE 函数:它将 return 在同一事务中的后续调用中得到完全相同的值。
更新
这种解决方法在大多数情况下都很好,但在某些情况下它会导致 Vertica 的内部错误。
请参阅 Vertica 论坛上的相关讨论:https://forum.vertica.com/discussion/239469/
我正在尝试执行以下查询,但出现错误:
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()
因为它可以 return 查询执行的不同部分的不同值(即当 GROUP BY
和 HAVING
将被实际处理时) ?
如果它是真的,那么为什么对基本查询 的以下修改也可以使它工作,无论使用 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 的边缘案例?
垂直版本: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() 被认为是一个 STABLE 函数:它将 return 在同一事务中的后续调用中得到完全相同的值。
更新
这种解决方法在大多数情况下都很好,但在某些情况下它会导致 Vertica 的内部错误。 请参阅 Vertica 论坛上的相关讨论:https://forum.vertica.com/discussion/239469/