Menu
CoddyTech

每个键保留一行

本课属于 Coddy SQL 学习旅程的“进阶内容”单元。第 26 课,共 27 课。

你经常会遇到这样的表,其中某个键(客户、传感器、产品)会出现多次,而你只想保留最新的记录,或者分数最高的记录。

像处理前 N 条时那样使用 ROW_NUMBER(),然后保留 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 表示“每个 此键单独排名”;ORDER BY 表示“最新的排在最前面”。每个分区中的第 1 行就是你要保留的行。

challenge icon

挑战

中等

可用的表和列:

  • readings:sensor_id、recorded_at、value

对于至少有 3 条读数的每个传感器,返回其值最高的一条读数。如果两条读数的 value 相同,则保留时间较近的一条。

输出 sensor_id、recorded_at、value,并按 sensor_id 排序。

亲手试试

WITH ranked AS (
    -- TODO:查询每条读数及其在所属传感器中的排名(rn)
    -- 以及该传感器的读数总数(total_readings)
)
SELECT sensor_id, recorded_at, value
FROM ranked
WHERE rn = 1 AND total_readings >= 3
ORDER BY sensor_id
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

进阶内容中的所有课

自己练习: SQL 在线编辑器