Tác giả: Lê Trung Kiên lớp java 08
Email: lekien.2803.cg@gmail.com
SĐT: 0942096947
Link bài toán: https://leetcode.com/problems/rising-temperature/

1. Mở đầu

Xin chào các bạn, mình viết ra bài viết này để chia sẻ phương pháp giải cũng như tư duy của mình về bài toán này của leetcode. Phương pháp của mình có thể không phải là tối ưu nhất, tuy nhiên mình sẽ phân tích, chia nhỏ bài toán ra thành các module nhỏ hơn để dễ giải quyết cũng như giúp các bạn hiểu được các yêu cầu mà bài toán đưa ra.

2. Đề bài

Cho bảng Weather:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| recordDate    | date    |
| temperature   | int     |
+---------------+---------+
id là khóa chính của bảng.
Bảng này chứa thông tin về nhiệt độ vào một ngày nhất định.

Viết một truy vấn SQL để tìm Id của tất cả các ngày có nhiệt độ cao hơn so với các ngày trước đó (ngày hôm qua).
Trả về bảng kết quả theo thứ tự bất kỳ.
Định dạng kết quả truy vấn nằm trong ví dụ sau.

Ví dụ:

Input: 
Weather table:
+----+------------+-------------+
| id | recordDate | temperature |
+----+------------+-------------+
| 1  | 2015-01-01 | 10          |
| 2  | 2015-01-02 | 25          |
| 3  | 2015-01-03 | 20          |
| 4  | 2015-01-04 | 30          |
+----+------------+-------------+
Output: 
+----+
| id |
+----+
| 2  |
| 4  |
+----+
Explanation: 
In 2015-01-02, the temperature was higher than the previous day (10 -> 25).
In 2015-01-04, the temperature was higher than the previous day (20 -> 30).

3. Phân tích

Ok, một bài sử dụng so sánh, tức là sẽ có mệnh đề WHERE. Tuy nhiên bài này lại so sánh các bản ghi trong chính bảng đó, chúng ta sẽ phải sử dụng SELF JOIN.
Tìm nhiệt độ cao hơn thì tất nhiên chúng ta sẽ sử dụng toán tử so sánh '>' rồi, vậy làm thế nào để so sánh hai ngày liền kề nhau? Khi này chúng ta sẽ sử dụng hàm dateDiff() để tìm ra được cặp ngày liền kề nhau mà từ đó lấy ra được nhiệt độ để so sánh với nhau. Và điều kiện đó là giá trị khi hàm dateDiff() lấy ra được phải bằng 1, tại vì ngày liền kề nhau mà.

4. Code chạy luôn cho nóng

Code của chúng ta sẽ như sau:

select a.id as "Id"
from weather a, weather b
where dateDiff(a.recordDate , b.recordDate) = 1 
      and a.temperature > b.temperature

5. Kết thúc

Qua bài viết này, mình đã chia sẻ cho các bạn cách mình tư duy khi giải bài tập trên leetcode. Hi vọng bài viết giúp ích cho các bạn trong cách tư duy để giải các bài tập khác. Xin cám ơn các bạn đã dành thời gian đọc và theo dõi. Peace!!!