You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL时间序列中为用户维度添加容量差值展示(不绘图)

问题场景

数据源为MySQL数据库,表结构如下:

FieldType
idint(11)
timetimestamp
sharevarchar(200)
uservarchar(50)
sizefloat

需求是生成每个用户的存储占用(满足share LIKE '/home%'且size>150条件)时间序列图表,同时展示最新记录与前一次的delta,但不想在图表中绘制delta曲线,理想方式是把delta拼接在用户名后面作为显示名称。此前尝试SQL拼接导致每个用户出现两条记录(带delta和不带),当前使用的SQL如下:

SELECT
  date(time) AS time,
  user,
  SUM(size) AS total_size,
  SUM(size) - LAG(SUM(size)) OVER (PARTITION BY user ORDER BY date(time) ASC) AS delta
FROM user_storage.storage
WHERE size > 150 AND share LIKE '/home%'
GROUP BY user, date(time)
ORDER BY time ASC

可行解决方案

方案一:SQL层面仅为最新记录拼接delta

如果只需要在最新时间点把delta拼到用户名上,其他时间点保留原用户名,可通过窗口函数标记用户的最新数据,再做条件拼接:

SELECT
  date(time) AS time,
  CASE 
    WHEN is_latest = 1 THEN CONCAT(user, ' (Δ:', delta, ')')
    ELSE user
  END AS display_user,
  total_size
FROM (
  SELECT
    date(time) AS time,
    user,
    SUM(size) AS total_size,
    SUM(size) - LAG(SUM(size)) OVER (PARTITION BY user ORDER BY date(time) ASC) AS delta,
    ROW_NUMBER() OVER (PARTITION BY user ORDER BY date(time) DESC) AS is_latest
  FROM user_storage.storage
  WHERE size > 150 AND share LIKE '/home%'
  GROUP BY user, date(time)
) t
ORDER BY time ASC, user

子查询中用ROW_NUMBER()给每个用户的记录按时间倒序编号,最新记录标记为1;外层查询仅给这条记录拼接delta,其他时间点保持原用户名,这样每个用户在图表中只会有一条时间序列,仅最新数据点显示带delta的名称。

方案二:可视化工具层面处理(推荐)

如果使用Grafana、Tableau、Power BI这类可视化工具,完全可以把delta展示逻辑放在工具端,无需修改SQL:

  • 用你当前的SQL查询出time、user、total_size、delta四个字段
  • 配置时间序列图表,以user为分组字段绘制total_size曲线
  • 配置数据标签或tooltip提示框,将delta字段添加进去,仅在鼠标hover或最新数据点上显示delta值
  • 或者在工具中设置动态别名,仅对每个用户的最新数据点,将别名设为{user} (Δ:{delta})

这种方式逻辑更灵活,不会破坏时间序列完整性,也能避免出现重复条目。

补充:宽表转窄表(适配部分可视化工具)

如果你的查询返回的是宽表格式(如示例中每个用户的total_size和delta为单独列),可先转成窄表结构(每条记录对应一个用户的一个时间点数据),方便工具处理:

SELECT time, user, metric_value, metric_type
FROM (
  SELECT
    date(time) AS time,
    user,
    SUM(size) AS total_size,
    SUM(size) - LAG(SUM(size)) OVER (PARTITION BY user ORDER BY date(time) ASC) AS delta
  FROM user_storage.storage
  WHERE size > 150 AND share LIKE '/home%'
  GROUP BY user, date(time)
) t
UNPIVOT (
  metric_value FOR metric_type IN (total_size, delta)
) AS unpivoted

内容的提问来源于stack exchange,提问作者DSX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:15:10