5

PostgreSQL にこのようなテーブルがあります。ID (主キー) に基づいて、16 レコードごとに平均や最大などの集計関数を実行したいと考えています。たとえば、最初の 16 レコードと 2 番目の 16 レコードなどの平均値を計算する必要があります。

+-----+-------------
| ID  |  rainfall  |
+-----+----------- |
|  1  |  110.2     |
|  2  |  56.6      |
|  3  |  65.6      |
|  4  |  75.9      |
+-----+------------
4

2 に答える 2

12

頭に浮かぶ最初のアプローチは、 を使用row_number()してテーブルに注釈を付け、次に 16 行のブロックでグループ化することです。

SELECT min(id) as first_id, max(id) AS last_id, avg(rainfall) AS avg_this_16
FROM (
  SELECT id, rainfall, row_number() OVER (order by id) AS n
  FROM the_table
) x(id,rainfall,n)
GROUP BY n/16
ORDER BY n/16;

これには、最後のグループの 16 個のサンプルが含まれているとは限らないことに注意してください。

または、ウィンドウ関数として使用して移動平均を計算できます。avg()

SELECT id, avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING)
FROM the_table;

...行番号で注釈を付けて、必要なものを選択する可能性があります。

SELECT id AS greatest_id_in_group, avg_last_16_inclusive FROM (
  SELECT
    id, 
    avg(rainfall) OVER (ORDER BY id ROWS 15 PRECEDING) AS avg_last_16_inclusive,
    row_number() OVER (ORDER BY id) AS n
  FROM the_table
) x WHERE n % 16 = 0;

これは、最後の n<16 サンプルを無視し、それらの行を返しません。

ID が連続していることが保証されていないと仮定していることに注意してください。ギャップがない場合はgroup by id/16、ウィンドウ関数を回避できます。

于 2012-10-27T10:08:32.133 に答える