0

我正在将 MySQL 查询移植到 Oracle。

INSERT INTO
  "stagedInserts" ("systemId", "timestamp")
SELECT
  :systemId AS "systemId", "d"."time" AS "timestamp"
FROM
  "data" "d"
WHERE
  "d"."systemId" = :systemId
GROUP BY 
  TRUNC("d"."time"/900)

GROUP BY 旨在与"time" DIV 900MySQL 中的等效,以确保我们最终每 15 分钟(900 秒)间隔只有一个时间戳。

上面的查询结果ORA-00979: not a GROUP BY expression

但是,如果我将 GROUP 添加到 SELECT 中,我们最终会得到:

SELECT
  :systemId AS "systemId", "d"."time" AS "timestamp", TRUNC("d"."time"/900)

结果是:ORA-00913: too many values

我该如何解决这个问题?

4

2 回答 2

2

您可以在 d.time 上使用聚合函数:

SELECT :systemId AS systemId, MAX(d.time) AS timestamp
                              -----------
FROM   data d
WHERE  d.systemId = :systemId
GROUP BY TRUNC(d.time/900);

或者你可以这样做:

SELECT :systemId AS systemId, TRUNC(d.time/900)*900 AS timestamp
                              ---------------------
FROM   data d
WHERE  d.systemId = :systemId
GROUP BY TRUNC(d.time/900);

现在您正在选择 GROUP BY 子句中使用的值,并将其乘以一个常数,而不是选择一个完全不同的值。

NB 这两个查询的结果是不一样的,所以考虑哪个更可取。

于 2013-06-03T11:36:45.520 回答
0

在第一种情况下,您会收到错误,因为每当您GROUP BY向查询添加子句时,您还应该在第一个查询中错过的列名称中包含相同的内容。

Trunc_Column在您的表中再添加一列,它将存储截断的值并更改您的查询类似于

INSERT INTO
  "stagedInserts" ("systemId", "timestamp","Trunc_Column")
SELECT
  :systemId AS "systemId", "d"."time" AS "timestamp",TRUNC("d"."time"/900)
FROM
  "data" "d"
WHERE
  "d"."systemId" = :systemId
GROUP BY 
  TRUNC("d"."time"/900)

以上查询将解决ORA-00913: too many values错误。

于 2013-06-03T11:27:05.453 回答