如何在 PL/SQL 中按每天分组?

Posted

技术标签:

【中文标题】如何在 PL/SQL 中按每天分组?【英文标题】:How to group by each day in PL/SQL? 【发布时间】:2012-04-12 12:04:32 【问题描述】:

我正在尝试使用 PL/SQL 获取每天的统计数据。

每天都有几个条目,大量错误:-) 我想按天对它们进行分组。

我现在在做什么:

SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
FROM log
WHERE (...)
GROUP BY MONTH, DAY, errormessage

这会导致 ORA-00904: "DAY": invalid identifier (stops on group by)。

有什么帮助吗? :D

【问题讨论】:

【参考方案1】:
SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
FROM log
WHERE (...)
GROUP BY TO_CHAR(dateTime, 'DD'), TO_CHAR(dateTime, 'MM'), errormessage

列别名不适用于GROUP BY,您需要完整的表达式。

【讨论】:

谢谢! 8 分钟内接受:D 很高兴为您提供帮助,您还应该查看@Lukas Eder 的答案,在某些情况下,他的解决方案更便于阅读。【参考方案2】:

您的问题是范围问题。 GROUP BY 子句是语句表表达式的一部分,因此在 SELECT 子句(即投影)之前进行评估。这意味着您的投影别名在分组时不可用。这是一种解决方案

SELECT DAY, MONTH, errormessage
FROM (
  SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
  FROM log
  WHERE (...)
)
GROUP BY MONTH, DAY, errormessage

这是另一个:

SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
FROM log
WHERE (...)
GROUP BY TO_CHAR(dateTime, 'MM'), TO_CHAR(dateTime, 'DD'), errormessage

非标准行为

请注意,某些数据库(包括 mysql、PostgreSQL 和其他数据库)确实允许从 GROUP BY 子句中的投影中引用列别名。但是,在更严格的 SQL 方言(例如 Oracle)中这是不可能的

【讨论】:

【参考方案3】:
SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
FROM log
WHERE (...)
GROUP by TO_CHAR(dateTime, 'DD'), TO_CHAR(dateTime, 'MM'), errormessage

你不能在 group by 中使用别名

【讨论】:

以上是关于如何在 PL/SQL 中按每天分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pl/sql 中安排作业?

如何在 presto SQL 中按月分组

如何在 BigQuery 中按外键分组?

如何在 Pandas 数据框中按列值分组

如何在python中按模式分组? [复制]

如何使用 Muenchian 分组 XSLT 1.0 在每个目录中按标题分组