3

私は次のテーブル構造を持っており、毎日毎時データがあります:

time_of_ocurrence(timestamp); particles(numeric)

"2012-11-01 00:30:00";191.3
"2012-11-01 01:30:00";46
 ...
"2013-01-01 02:30:00";319.6

毎日の最大値とこの最大値が発生する時間を選択するにはどうすればよいですか? 私はもう試した

SELECT date_trunc('hour', time_of_ocurrence) as hora,
MAX(particles)
from my_table WHERE time_of_ocurrence > '2013-09-01'
GROUP BY hora ORDER BY hora

しかし、うまくいきません:

"2013-09-01 00:00:00";34.35
"2013-09-01 01:00:00";33.13
"2013-09-01 02:00:00";33.09
"2013-09-01 03:00:00";28.08

私の結果は代わりにこの形式になります(1日あたり1つの最大値、時間を表示)

"2013-09-01 05:00:00";100.35
"2013-09-02 03:30:00";80.13

どうやってやるの?ありがとう!

4

2 に答える 2

3

このタイプの質問は StackOverflow で頻繁に出てきます。他の解決策を見たい場合は、これらの質問は

編集:次のコードを、時間ではなく日ごとにグループ化するように変更しました。

ここに1つの解決策があります:

SELECT t.*
FROM (
  SELECT date_trunc('day', time_of_ocurrence) as hora, MAX(particles) AS particles
  FROM my_table
  GROUP BY hora
) AS _max
INNER JOIN my_table AS t 
  ON _max.hora = date_trunc('day', t.time_of_ocurrence)
  AND _max.particles = t.particles
WHERE time_of_ocurrence > '2013-09-01'
ORDER BY time_of_ocurrence;

複数の行に最大値がある場合は、1 日に複数の結果が表示されることもあります。

このような重複を表示しないウィンドウ関数を使用した別のソリューション:

SELECT * FROM (
  SELECT *, 
    ROW_NUMBER() OVER (PARTITION BY date_trunc('day', time_of_ocurrence) 
        ORDER BY particles DESC) AS _rn
  FROM my_table
) AS _max
WHERE _rn = 1
ORDER BY time_of_ocurrence;

複数の行の最大数が同じである場合でも、行番号が 1 の行が 1 つあります。どの行の番号が 1 であるかを特定の制御が必要な場合は、一意の列を使用してパーティショニング句で ORDER BY を使用し、そのような関係を断ち切る必要があります。

于 2013-10-01T15:52:56.243 に答える
2

ウィンドウ関数を使用します。

select distinct
  date_trunc('day',time_of_ocurrence) as day,
  max(particles) over (partition by date_trunc('day',time_of_ocurrence)) as particles_max_of_day,
  first_value(date_trunc('hour',time_of_ocurrence)) over (partition by date_trunc('day',time_of_ocurrence) order by particles desc)
from my_table
order by 1

ここでのエッジ ケースの 1 つは、同じ MAX 数のパーティクルが同じ日に異なる時間に表示される場合です。このバージョンでは、そのうちの 1 つをランダムに選択します。どちらか一方を優先する場合 (たとえば、常に前のもの)、それを order by 句に追加できます。

      first_value(date_trunc('hour',time_of_ocurrence)) over (partition by date_trunc('day',time_of_ocurrence) order by particles desc, time_of_ocurrence)
于 2013-10-01T15:32:11.573 に答える