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

MySQL如何选取不同日期的不同字段并计算涨跌幅?

在MySQL中跨日期选取字段并计算百分比差异

嗨,作为MySQL新手能想到尝试用一次查询解决这个问题真的很棒!完全不需要分两次发送查询请求,咱们可以用两种简单的方法在单条SQL里实现需求——条件聚合或者自连接,下面我用你的示例数据给你详细演示:

方法一:条件聚合(推荐,更简洁)

这种方法适合需要提取多个日期不同字段的场景,用CASE WHEN配合聚合函数把分散在不同行的字段整合到同一行:

SELECT
  symbol,
  MAX(CASE WHEN date = '2019-02-27' THEN open END) AS start_open,
  MAX(CASE WHEN date = '2019-03-01' THEN close END) AS end_close,
  ROUND(
    ((MAX(CASE WHEN date = '2019-03-01' THEN close END) - MAX(CASE WHEN date = '2019-02-27' THEN open END)) 
    / MAX(CASE WHEN date = '2019-02-27' THEN open END)) * 100,
    1
  ) AS percentage_change
FROM stock_prices
WHERE symbol = 'HCL'
  AND date IN ('2019-02-27', '2019-03-01')
GROUP BY symbol;

这段SQL会返回:

symbolstart_openend_closepercentage_change
HCL36.0042.0016.6

关键逻辑解释:

  • CASE WHEN date = '指定日期' THEN 字段 END:只保留对应日期的目标字段值,其他日期返回NULL
  • MAX()函数:因为每个指定日期只会有一个有效数值,MAX会自动忽略NULL,提取出我们需要的字段值
  • 百分比计算:用结束值减起始值,除以起始值再乘以100,最后用ROUND()保留1位小数

方法二:自连接(直观易懂,适合两两对比)

如果只是需要两个日期的字段对比,自连接的方式会更直观——把同一个表当成两个独立的表,分别筛选出目标日期的行,再通过symbol关联起来:

SELECT
  s1.symbol,
  s1.open AS start_open,
  s2.close AS end_close,
  ROUND(
    ((s2.close - s1.open) / s1.open) * 100,
    1
  ) AS percentage_change
FROM stock_prices s1
JOIN stock_prices s2
  ON s1.symbol = s2.symbol
WHERE s1.date = '2019-02-27'
  AND s2.date = '2019-03-01'
  AND s1.symbol = 'HCL';

这个查询会得到和上面完全一样的结果,优点是逻辑更直白,适合刚接触MySQL的新手理解。

额外提示:

因为你的open和close字段是Decimal类型,MySQL在进行数值运算时会自动保留精度,不用担心计算过程中出现精度丢失的问题。如果需要支持更多日期的对比,条件聚合的扩展性会更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:18:14