使用Python3执行复杂MySQL查询未返回正确结果求助
解决MySQL计算股票每日价格变动的问题
嘿,我看你想计算每只股票的每日价格变动,刚好之前做过类似的需求,给你分享两个可行的方案,不管是旧版还是新版MySQL都能用~
首先先明确你的数据和需求:
你的原始表(假设表名叫stock_prices)数据是这样的:
| Stock | Date | Price |
|---|---|---|
| GOOG | 2012-05-20 | 402 |
| GOOG | 2012-05-21 | 432 |
| APPL | 2012-05-20 | 553 |
| APPL | 2012-05-21 | 590 |
| FB | 2012-05-20 | 40 |
| FB | 2012-05-21 | 34 |
你想要得到2012-05-21当天每只股票相对于前一天的价格变动,结果如下:
| Stock | Date | Change |
|---|---|---|
| GOOG | 2012-05-21 | 30 |
| APPL | 2012-05-21 | 37 |
| FB | 2012-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
相关产品推荐
相关产品推荐

