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会返回:
| symbol | start_open | end_close | percentage_change |
|---|---|---|---|
| HCL | 36.00 | 42.00 | 16.6 |
关键逻辑解释:
CASE WHEN date = '指定日期' THEN 字段 END:只保留对应日期的目标字段值,其他日期返回NULLMAX()函数:因为每个指定日期只会有一个有效数值,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
相关产品推荐
相关产品推荐

