0

I am porting a MySQL query to 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)

The GROUP BY is intended to be the equivalent of "time" DIV 900 in MySQL, to ensure that we end up with only one timestamp for each 15 minute (900 second) interval.

The above query results in ORA-00979: not a GROUP BY expression.

However, if I add the GROUP to the SELECT so we end up with:

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

It results in: ORA-00913: too many values.

How can I resolve this issue?

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 句で使用される値を選択し、それを定数で乗算しています。

注: これら 2 つのクエリの結果は同じではないため、どちらが望ましいかを検討してください。

于 2013-06-03T11:36:45.520 に答える
0

最初のケースでは、クエリに句を追加するたびGROUP BYに、最初のクエリで見逃した列名にも同じものを含める必要があるため、エラーが発生します。

Trunc_Columnテーブルにもう1列追加します。これにより、切り捨てられた値が格納され、クエリが次のように変更されます

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 に答える