国のテーブルと天気のテーブルの2つのテーブルがあります。過去15日以内に雨が降らなかった国の名前をすべて取得したいと思います。
天気表には「DayNum」という列があり、1->無限大から毎日1ずつ増えていきます。これはユニークです。このテーブルには、「Rain」という列もあります。これは、0または1のビットブール値です。
また、すべての国が同じ日に追加されたわけではないため、最大DayNumは国ごとに異なります。
以下の表の例(読みやすくするためにデータを切り取っています):
国:
ID Name
1 USA
2 Cananda
3 Brazil
天気
ID Country_id DayNum Rain
1 1 1 0
2 1 2 0
3 1 3 1
これが私の現在のクエリの試みです(これに何日も取り組んでいます):
SELECT countries.name, weather.daynum
FROM countries INNER JOIN weather ON countries.id = weather.country_id
GROUP BY countries.name
HAVING weather.daynum > (MAX(weather.day_num) - 15) AND SUM(weather.rain) = 0;
これでうまくいくと思いますが、パフォーマンスに深刻な問題があります。私が書く必要のある実際のクエリは、さまざまなデータ(まったく同じ概念)と数百万の行を扱います。このクエリは、指数関数的に遅くなるようです。
誰かアドバイスはありますか?
私が持っていたもう1つのアイデアは、JOINを(weather.day_numで注文しながら)上位15レコードのみを取得するように制限することでしたが、JOIN内でこれを行う方法が見つかりませんでした(可能な場合)。