15

PostgreSQL 9.2には、タイムスタンプを含む次のテーブルがあります。

gid [PK](bigserial)、timestamp_mes(タイムゾーンなしのタイムスタンプ)、time_diff(間隔)
1、2012-01-23 11:03:40、空
2、2012-01-23 11:03:42、空
3 2012-01-23 11:03:44、空

間隔列(time_diff)を追加し、このクエリの結果である時間差の値を入力したいと思います。

SELECT timestamp_mes - lag(timestamp_mes, 1) 
over (order by timestamp_mes) as diff
from gc_entretien.trace order by timestamp_mes

次のクエリを実行してtime_diff列を更新しようとしましたが、成功しませんでした。

UPDATE gc_entretien.trace set time_diff = 
(SELECT trace.timestamp_mes - lag(trace.timestamp_mes, 1) 
over (order by trace.timestamp_mes) 
from gc_entretien.trace order by timestamp_mes);

これにより、エラーが発生します。

エラー:式として使用されるサブクエリによって返される複数の行

時間差クエリの結果の値でtime_diff列を更新するにはどうすればよいですか?

4

3 に答える 3

38

このようなもの:

with new_values as (
   SELECT gid, 
          timestamp_mes - lag(timestamp_mes, 1) over (order by timestamp_mes) as diff
   from gc_entretien.trace 
)
update gc_entretien.trace as tr
  set time_diff = nv.diff
from new_values nv
where nv.gid = tr.gid;
于 2012-12-07T19:32:09.700 に答える
5

UPDATEでウィンドウ関数を直接使用することはできないため、代わりにサブSELECTで使用する必要があります-これは実行済みです。ただし、UPDATE でそのサブ SELECT を使用しようとした方法は、有効な構文ではありません。Postgres docs here で説明されているように、更新の FROM 句にサブ SELECT を配置する必要があります。

http://www.postgresql.org/docs/9.2/static/sql-update.html

やりたいことの正しい構文は次のとおりです。

UPDATE gc_entretien.trace t
SET time_diff = subquery.diff
FROM (SELECT {{SomeUniqueId}}, 
             timestamp_mes - lag(timestamp_mes, 1) over (order by timestamp_mes) as diff
      FROM gc_entretien.trace order by timestamp_mes) AS subquery
WHERE t.{{SomeUniqueId}} = subquery.{{SomeUniqueId}}

明らかに、私が書いた行が持っている一意のIDの列名を置き換える必要があります{{SomeUniqueId}}

于 2012-12-07T19:36:23.100 に答える
1

サブクエリが複数の結果を返すため、実際にはこのエラーが発生しています。

ご質問の内容がよく理解できませんので、

それを解決するための例を挙げます。

update table t1 set time_diff= select *your_operation* from table t2 where t1.id=t2.id

ここで:-your_operation は時差を見つけるロジックを意味し、

于 2012-12-07T17:30:17.977 に答える