どーも!
たかぽんです!
今回はSQLに挑戦です!
今回はRisingTemperatureに挑戦してみます。
割と最近適当に緑のタグの問題を選んでいるのですが...
最近はRedashなどで使う機会もあるので、業務的にも慣れておいて損はないんですが...!
SQLの問題多いですね...!
197. Rising Temperature
問題は以下です!
温度上昇・・・?
毎日温度を測定したデータが存在していて、そのデータから、前日より温度が高く観測された日付のデータが入っているデータのIDを取得しろ...という問題ですね。
割と実践的な感じですね...!
では、次章でアルゴリズムを検討していきます。
アルゴリズム
今回の問題では温度が高くなっていること、そして日付が先日と次の日で連続していることに着目すると良さそうです。
例えば...
select * from Weather w1 , Weather w2;
まずは脳死でここまで。
おおよその出力は以下のようになります。(二つのテーブルが繋がった感じです。前半はw1, 後半がw2です)
+----+------------+-------------+----+------------+-------------+
| id | recordDate | Temperature | id | recordDate | Temperature |
+----+------------+-------------+----+------------+-------------+
| 1 | 2015-01-01 | 10 | 1 | 2015-01-01 | 10 |
| 1 | 2015-01-01 | 10 | 2 | 2015-01-02 | 25 |
| 1 | 2015-01-01 | 10 | 3 | 2015-01-03 | 20 |
| 1 | 2015-01-01 | 10 | 4 | 2015-01-04 | 30 |
| 2 | 2015-01-02 | 25 | 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 | 2 | 2015-01-02 | 25 |
| 2 | 2015-01-02 | 25 | 3 | 2015-01-03 | 20 |
| 2 | 2015-01-02 | 25 | 4 | 2015-01-04 | 30 |
...
...
ここら辺まではいったん脳死で手をうごかしました。
これで、次にw2.Temperatureがw1.Temperatureよりも大きい...と言う条件をつけます。
# Write your MySQL query statement below
select * from Weather w1 , Weather w2
where w1.Temperature < w2.Temperature;
and adddate(w1.recordDate, interval 1 day) = w2.recordDate;
# 以下出力
+----+------------+-------------+----+------------+-------------+
| id | recordDate | Temperature | id | recordDate | Temperature |
+----+------------+-------------+----+------------+-------------+
| 1 | 2015-01-01 | 10 | 2 | 2015-01-02 | 25 |
| 1 | 2015-01-01 | 10 | 3 | 2015-01-03 | 20 |
| 1 | 2015-01-01 | 10 | 4 | 2015-01-04 | 30 |
| 2 | 2015-01-02 | 25 | 4 | 2015-01-04 | 30 |
...
...
これで、先程の何もしていないテーブルから、確実にTemperatureの関係が正しいものだけ取り出せました。
そして最後に、w1.recordDateがw2.recordDateの前日...と言う条件をつけます。
この際、SQLではadddateと言うメソッドを使用すればできたので、そちらでw1.recordDateに1日分追加し、"前日である"と言うことを条件化していきました。
# Write your MySQL query statement below
select * from Weather w1 , Weather w2
where w1.Temperature < w2.Temperature
and adddate(w1.recordDate, interval 1 day) = w2.recordDate;
# 以下出力
+----+------------+-------------+----+------------+-------------+
| id | recordDate | Temperature | id | recordDate | Temperature |
+----+------------+-------------+----+------------+-------------+
| 1 | 2015-01-01 | 10 | 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 | 4 | 2015-01-04 | 30 |
+----+------------+-------------+----+------------+-------------+
あとは出力をw2のidを出してあげればOKです。(温度が上がっている日のidを出すため。)
逆に、次の日に温度が上がった日のidであれば、w1のidを出せばいいですね。
というわけで、筆者は上記のように解いていきました!
adddateとかもできたんですね...!
あんまりsqlで日付の加算を使ったことがなかったので、また知見が広がりました...!
最後に筆者が提出したクエリを記載しておきます。
提出したコード
Runtime: 313 ms, faster than 88.40% of MySQL online submissions for Rising Temperature.
Memory Usage: 0B, less than 100.00% of MySQL online submissions for Rising Temperature.
# Write your MySQL query statement below
select w2.id from Weather w1 , Weather w2
where w1.Temperature < w2.Temperature
and adddate(w1.recordDate, interval 1 day) = w2.recordDate;
それでわ!