3

だから、私はSQLクエリに問題があります。

ドイツの都市の気象データを取得することです。4 つのテーブルがあります: staedte (主キー loc_id を持つ都市)、gehoert_zu (都市キーとこの都市に最も近い気象観測所のキー (stations_id) を含む)、wettermessung (すべての気象情報と観測所のキー値) および wetterstation (ステーション キーと場所を含む)。そして、私はPostgreSQLを使用しています

テーブルは次のようになります。

wetterstation
s_id[PK]   standort    lon    lat    hoehe 
----------------------------------------
10224      Bremen      53.05  8.8    4


wettermessung
stations_id[PK]    datum[PK]     max_temp_2m   ......
----------------------------------------------------
10224              2013-3-24     -0.4


staedte
loc_id[PK]    name    lat    lon
-------------------------------
15            Asch    48.4   9.8


gehoert_zu
loc_id[PK]    stations_id[PK]
-----------------------------
15            10224

私がやろうとしているのは、指定された日付 (1 か月または 1 日) に (たとえば) 最高気温を持つ都市の名前を取得することです。気象データはステーションにバインドされているため、実際にはステーションの ID を取得し、このステーションの都市に対応する都市を 1 つ選択する必要があります。考えられる質問は次のとおりです。「6 月に最も暑かったのはどの都市ですか?」そして、たとえば、測定された最高気温は測点番号 10224 でした。その結果、都市アッシュを取得したいと考えています。私がこれまでに得たものはこれです

SELECT name, MAX (max_temp_2m)
FROM wettermessung, staedte, gehoert_zu 
WHERE wettermessung.stations_id = gehoert_zu.stations_id
    AND gehoert_zu.loc_id = staedte.loc_id 
    AND wettermessung.datum BETWEEN '2012-8-1' AND '2012-12-1' 
GROUP BY name
ORDER BY MAX (max_temp_2m) DESC 
LIMIT 1

結果には 2 つの問題があります。1) 時間がかかりすぎます。テーブルはそれほど大きくはありません (都市には約 70k のエントリがあります) が、処理を完了するのに 1 ~ 7 分かかります (期間によって異なります) 2) 常に同じ都市が生成されます。どちらか正しい。

問題を十分に明確に説明できたことを願っています。どんな種類の助けも喜んで提供します。前もって感謝します !:D

4

3 に答える 3

0

一貫した命名規則を使用することをお勧めします。行ごとに 1 つの項目を保持するテーブルの単数形は、適切な規則です。あなたはテーブルを壊すだけですstaedte。する必要がありますstadt

また、とstation_idの代わりに一貫して使用することをお勧めします。s_idstations_id

あなたの質問のために、これらの前提に基づいて構築します:

... 指定された日付で最高気温が ... ある都市の名前を取得する

SELECT s.name, w.max_temp_2m
FROM  (
   SELECT station_id, max_temp_2m
   FROM   wettermessung
   WHERE  datum >= '2012-8-1'::date
   AND    datum <  '2012-12-1'::date       -- exclude upper border
   ORDER  BY max_temp_2m DESC, station_id  -- id as tie breaker
   LIMIT  1
   ) w
JOIN    gehoert_zu g USING (station_id) -- assuming normalized names
JOIN    stadt      s USING (loc_id)
  • JOIN読みやすさとメンテナンスを向上させるために、明示的な条件を使用します。

  • テーブル エイリアスを使用して、クエリを簡素化します。

  • 一般的な使用x >= a AND x < b例である、下の境界線を含め、上の境界線を除外するために使用します。

  • 他のテーブルに参加して都市名を取得する前に、最初に集計し、気温が最も高いステーションを選択します。はるかに簡単で高速です。

  • 指定された時間内に複数の「wettermessungen」が発生した場合の対処方法が指定されていませんmax_temp_2m。タイブレーカーとして追加station_idしました。つまり、資格のあるステーションが複数ある場合、ID が最も小さいステーションが一貫して選択されます。

于 2013-06-27T00:26:03.727 に答える
0

これは、最高値、最低値、最大値、最小値などの値を持つ項目を取得する方法の一般的な例です。特定の状況に合わせて調整できます。

select fred, barney, wilma
from bedrock join
(select fred, max(dino) maxdino
from bedrock
where whatever
group by fred ) flinstone on bedrock.fred = flinstone.fred
where dino = maxdino
and other conditions
于 2013-06-26T22:56:19.667 に答える