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 = 1PARTITION 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.
Thử thách
Trung bìnhCá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
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
6Công thức phân tích dữ liệu
Top N trong mỗi nhómTỷ lệ trên tổngTổng lũy kếGiữ lại một hàng cho mỗi khóaÔn tập: khách hàng hàng đầuTự luyện tập: Playground SQL