你好呀,汪同学! 2023-05-12 10:25 采纳率: 82.1%
浏览 14

postgresql查询

postgresql
有A表 字段为 车辆名,日期时间,里程

如何从A表中获取车辆每10000公里时的日期时间和里程。这个里程不一定为准确10000,20000。获取其最接近10000里程差的即可。

最后输出字段为 车辆名,日期时间,里程

表头表头表头
A2023-05-11 15:23:2310001
A2023-05-30 15:33:3320010
B2022-05-12 16:00:3110100
  • 写回答

3条回答 默认 最新

  • 滚动的小薯条 2023-05-12 10:35
    关注

    引用gpt部分指引作答:
    你可以使用 PostgreSQL 的窗口函数和数值函数来实现这个需求。以下是一个示例查询语句:

    SELECT vehicle_name, datetime, mileage
    FROM (
      SELECT *,
             ROW_NUMBER() OVER (PARTITION BY vehicle_name ORDER BY ABS((mileage / 10000) * 10000 - mileage) ASC) AS rn
      FROM A
    ) subquery
    WHERE rn = 1;
    

    这个查询语句的步骤如下:

    1. 使用窗口函数 ROW_NUMBER() 将每个车辆的记录按照与最接近的 10000 倍数的里程差进行排序,里程差计算为 ABS((mileage / 10000) * 10000 - mileage)
    2. 在子查询中,使用 PARTITION BY vehicle_name 将数据按照车辆名进行分组,并计算每个分组内的排序号码。
    3. 外部查询中,选择排序号码为 1 的记录,即每个车辆里程最接近 10000 倍数的记录。
    4. 输出车辆名、日期时间和里程字段。

    将上述查询语句应用到你的示例数据,将得到以下结果:

    车辆名    日期时间    里程
    A    2023-05-11 15:23:23    10001
    B    2022-05-12 16:00:31    10100
    

    注意,对于车辆名为 A 的记录,虽然里程最接近 10000 的记录是第一行,但是第二行的里程差也是相同的。根据窗口函数的特性,如果有相同的排序值,将会按照输入数据的顺序选择其中一行。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月12日

悬赏问题

  • ¥15 关于大棚监测的pcb板设计
  • ¥20 sim800c模块 at指令及平台
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计