代码之家  ›  专栏  ›  技术社区  ›  TriumphTruth

从满足特定条件的数据集中选择1行

  •  0
  • TriumphTruth  · 技术社区  · 5 月前

    我需要一些帮助。

    数据库设计:

    设备表

    身份证件 固件
    1. 1.1
    2. 1.2
    3. 1.1
    4. 1.1
    5. 1.2

    调试设备表

    设备ID 人员ID
    1. 2.
    2. 4.
    3. 1.

    GPS位置表

    设备ID 经度 经度 记录日期
    1. 2. 3. 2025-08-01
    2. 4. 1. 2025-08-01
    3. 1. 3. 2025-08-01
    1. 2. 4. 2025-08-01
    2. 4. 2. 2025-08-01
    3. 1. 6. 2025-08-01
    1. 2. 6. 2025-08-01
    2. 4. 8. 2025-08-01
    3. 1. 9 2025-08-01

    我想要的最终结果如下:

    设备ID 经度 经度 记录日期
    1. 2. 3. 2025-08-01
    2. 4. 1. 2025-08-01
    3. 1. 3. 2025-08-01

    因此,我们的想法是,表中可以有多个设备条目,但我只需要选择具有最高记录日期的条目。设备应仅为“调试设备”表中可用的设备。

    我试过什么?

    我尝试了各种方法,如distinct、cte、group by,但到目前为止,我还无法达到预期的效果。

    请告诉我应该采取什么方法,我读到有一些类似排名的东西也有帮助。

    谢谢。

    1 回复  |  直到 5 月前
        1
  •  1
  •   Bart McEndree    5 月前

    您可以使用Row_Number对每个设备ID的行进行编号。然后使用通用表表达式(CTE)仅显示rn=1的行。

    WITH CTE as
    (
    SELECT G.DeviceID, 
           G.Longitude,     
           G.Lattitude,     
           G.RecordedDate, 
           Row_Number() OVER (PARTITION BY G.DeviceID ORDER BY RecordedDate desc) as rn
    FROM GPSLocation G
    INNER JOIN   CommissionedDevice CD ON CD.DeviceID=G.DeviceID
    )
    SELECT * 
    FROM CTE 
    WHERE rn=1
    

    fiddle

    fiddle with time added

    设备ID 经度 经度 记录日期 rn
    1. 2. 3. 2025-08-01 1.
    2. 4. 8. 2025-08-01 1.
    3. 1. 3. 2025-08-01 1.