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

使用Python3执行复杂MySQL查询未返回正确结果求助

解决MySQL计算股票每日价格变动的问题

嘿,我看你想计算每只股票的每日价格变动,刚好之前做过类似的需求,给你分享两个可行的方案,不管是旧版还是新版MySQL都能用~

首先先明确你的数据和需求:
你的原始表(假设表名叫stock_prices)数据是这样的:

StockDatePrice
GOOG2012-05-20402
GOOG2012-05-21432
APPL2012-05-20553
APPL2012-05-21590
FB2012-05-2040
FB2012-05-2134

你想要得到2012-05-21当天每只股票相对于前一天的价格变动,结果如下:

StockDateChange
GOOG2012-05-2130
APPL2012-05-2137
FB2012-05-21-6

方案一:自连接(兼容所有MySQL版本)

如果你的MySQL版本比较旧(低于8.0),没有窗口函数的话,可以用表自连接的方式来实现:

SELECT 
    t1.Stock,
    t1.Date,
    (t1.Price - t2.Price) AS Change
FROM stock_prices t1
JOIN stock_prices t2 
  ON t1.Stock = t2.Stock 
  AND t1.Date = DATE_ADD(t2.Date, INTERVAL 1 DAY)
WHERE t1.Date = '2012-05-21';

思路解释:

  • 把表stock_prices分别取别名t1(当天数据)和t2(前一天数据)
  • 通过JOIN条件匹配同一只股票(t1.Stock = t2.Stock),并且t1的日期是t2日期加1天(DATE_ADD(t2.Date, INTERVAL 1 DAY))
  • 最后计算当天价格减去前一天价格,得到变动值Change

方案二:窗口函数(MySQL 8.0+推荐)

如果你的MySQL是8.0及以上版本,用LAG()窗口函数会更简洁高效:

SELECT 
    Stock,
    Date,
    Price - LAG(Price) OVER (PARTITION BY Stock ORDER BY Date) AS Change
FROM stock_prices
WHERE Date = '2012-05-21';

思路解释:

  • PARTITION BY Stock:按股票代码分组,保证只计算同一只股票的价格变动
  • ORDER BY Date:按日期排序,确保取到的是前一天的价格
  • LAG(Price):获取当前行的前一行的Price值,然后用当前价格减去它得到变动值

在Python3中执行查询的示例

你可以用pymysql库来执行上面的SQL,示例代码如下:

import pymysql

# 替换成你的数据库连接信息
conn = pymysql.connect(
    host='localhost',
    user='your_username',
    password='your_password',
    database='your_database'
)

try:
    with conn.cursor() as cursor:
        # 选择上面的任意一个SQL语句
        sql = """
        SELECT 
            Stock,
            Date,
            Price - LAG(Price) OVER (PARTITION BY Stock ORDER BY Date) AS Change
        FROM stock_prices
        WHERE Date = '2012-05-21';
        """
        cursor.execute(sql)
        results = cursor.fetchall()
        
        # 处理结果,比如打印出来
        print("Stock | Date       | Change")
        print("---------------------------")
        for row in results:
            print(f"{row[0]}   | {row[1]} | {row[2]}")
finally:
    conn.close()

这样就能得到你想要的结果啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:12:04