我正在使用股票价格数据,并使这个查询每月获得一个价格,例如Google(来自每个工作日价格的表格):
SELECT * FROM pricedata WHERE symbol='GOOG' GROUP BY symbol,month(date),year(date)
2012-07-02
2012-06-01
2012-05-01
如果我删除了WHERE子句,它将返回月份的最后一个日期而不是第一个日期(当然还有更多行,因为表格中的所有符号都显示出来),如
SELECT * FROM pricedata GROUP BY symbol,month(date),year(date)
2012-07-31
2012-06-29
2012-05-31
我理解'服务器可以自由选择每个组中的任何值',所以我很幸运,第一个查询可以按我的意愿运行,但我想知道为什么会发生这种变化。
是否有快速解决方案可以始终获得每月的第一个价值?我没有发现任何类似的问题,但它们可能在那里......第二个查询并不重要,但我试图为仅按月计算的记录构建一个缩小尺寸的表,并遇到了这个问题。
答案 0 :(得分:1)
我想知道为什么会发生这种变化。
服务器可以自由选择组中的任何值,但实际上它会选择它找到的第一个值。如果您在symbol
上有索引,那么它将选择第一个索引,因为它们在索引中排序。如果删除WHERE
子句,它将使用另一个索引或聚簇键。这将按不同的顺序排序,因此服务器遇到的第一行将是不同的。
基本上你不应该依赖于获得任何特定的价值。正如文档所述,服务器可以自由选择任何值,并且未指定选择的值。
是否有快速解决方案可以始终获得每个月的第一个值?
SELECT symbol, MIN(date) AS date
FROM pricedata
GROUP BY symbol, month(date), year(date)