WenXiangShi 2023-10-30 10:25 采纳率: 84.2%
浏览 9
已结题

mysql查当日,昨日,当月的数据,sql调优

需求:查询该项目 ,所有水表的总累计用水,当日累计用水量,当月累计用水量,昨日累计用水量;
用水记录表;
水表id id;
累计用水量 measure;
项目编号: projectcode;
更新时间 updatedate;
注:该表每隔五分种会新增一条数据;用水量会从第一条记录开始一直累计增加
(如果水表是今天新增的,那么昨日没有记录)
难点:用尽量简洁的sql,考虑到实际情况,以后这张表会非常大,所以通过什么方式查询能够快;

我之前的方案是:通过for循环,把该项目的水表id轮着查一遍;分别查了本月,本日,昨日的第一条数据,和当前的最新一条数据 进行相减,这样每一遍循环就要查四条sql;感觉很蠢;

img

  • 写回答

4条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2023-10-30 10:51
    关注

    你循环写,确实很蠢。
    其实一条sql就可以解决,用case when 即可。
    对于查询总累计用水、当日累计用水、当月累计用水以及昨日累计用水,你可以使用以下 SQL 查询语句,假设你的数据表名为 water_meter_records

    SELECT 
        projectcode,
        MAX(measure) AS total_water_today,
        MAX(CASE WHEN DATE(updatedate) = CURDATE() THEN measure END) AS today_water,
        MAX(CASE WHEN DATE(updatedate) = DATE_SUB(CURDATE(), INTERVAL 1 DAY) THEN measure END) AS yesterday_water,
        MAX(CASE WHEN DATE_FORMAT(updatedate, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') THEN measure END) AS this_month_water
    FROM water_meter_records
    GROUP BY projectcode;
    

    这个 SQL 查询会针对每个项目编号(projectcode)计算总累计用水(total_water_today)、当日累计用水(today_water)、昨日累计用水(yesterday_water)、当月累计用水(this_month_water)。

    • total_water_today 表示项目的总累计用水,因为它是 MAX(measure),所以它返回了最新的用水记录。
    • today_water 使用 MAX(CASE ...) 来找到当日累计用水,只包括今天的记录。
    • yesterday_water 同样使用 MAX(CASE ...) 来找到昨日累计用水,只包括昨天的记录。
    • this_month_water 也是使用 MAX(CASE ...) 来找到当月累计用水,只包括本月的记录。

    这个查询会返回每个项目的用水统计数据,可以根据项目编号来区分。确保你的数据表中包含了足够的记录来获取准确的统计信息。如果你需要进一步的调优,可以考虑为 updatedate 列添加索引,以提高查询性能。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月7日
  • 已采纳回答 10月30日
  • 创建了问题 10月30日

悬赏问题

  • ¥15 需要在vitis下实现彩调视频图像累加,并输出
  • ¥15 解决不了的LNK2019错误
  • ¥20 MATLAB仿真三相桥式全控整流电路
  • ¥15 EDA技术关于时序电路设计
  • ¥15 百度文心一言流式返回sse失败
  • ¥15 由于远程方已关闭传输流,身份验证失败
  • ¥15 rt-detr,PCB,目标检测
  • ¥15 有偿求指导实证代码。cfps清洗合并后,无论是构建平衡面板还是非平衡面板,都是只剩几百个样本量。求指导一下哪里出问题了,不要潦草回复
  • ¥15 mutlinichenet
  • ¥50 Qt5.14.2怎样使用qlistwidget存储指针类数据并更新?