Menu
CoddyTech

Giữ lại một hàng cho mỗi khóa

Thuộc phần Vượt ra ngoài kiến thức cơ bản trong hành trình SQL của Coddy. Bài học 26 trên 27.

Thường thì bạn sẽ có một bảng trong đó một khóa (khách hàng, cảm biến, sản phẩm) xuất hiện nhiều lần và bạn chỉ muốn giữ lại mục mới nhất hoặc mục có điểm số cao nhất.

Dùng ROW_NUMBER() như cách bạn đã làm với top-N, sau đó giữ lại rn = 1.

WITH ranked AS (
    SELECT *,
           ROW_NUMBER() OVER (
               PARTITION BY customer_id ORDER BY purchased_at DESC
           ) AS rn
    FROM purchases
)
SELECT * FROM ranked WHERE rn = 1

PARTITION BY có nghĩa là “mỗi khóa này có một thứ hạng”; ORDER BY có nghĩa là “mới nhất trước”. Hàng 1 trong mỗi phân vùng là hàng bạn muốn giữ lại.

challenge icon

Thử thách

Trung bình

Các bảng và cột hiện có:

  • readings: sensor_id, recorded_at, value

Với mỗi cảm biến có ít nhất 3 lần ghi nhận, trả về lần ghi nhận có giá trị cao nhất. Nếu hai lần ghi nhận có cùng value, hãy giữ lại lần gần đây hơn.

Xuất sensor_id, recorded_at, value, theo thứ tự sensor_id.

Tự làm thử

WITH ranked AS (
    -- TODO: chọn từng bản ghi đo cùng thứ hạng của nó trong cảm biến tương ứng (rn)
    -- và số bản ghi đo của cảm biến đó (total_readings)
)
SELECT sensor_id, recorded_at, value
FROM ranked
WHERE rn = 1 AND total_readings >= 3
ORDER BY sensor_id
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Vượt ra ngoài kiến thức cơ bản

Tự luyện tập: Playground SQL