2

我正在处理股票价格数据并进行此查询以获取每月一个价格,例如 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

我知道“服务器可以从每个组中自由选择任何值”,所以我可能很幸运第一个查询按我的意愿工作,但我想知道为什么会发生这种变化。

是否有一个快速的解决方案来持续获得每个月的第一个值?我还没有发现任何类似的问题,但它们可能在那里......第二个查询并不重要,但我试图为每月记录建立一个缩小大小的表并遇到了这个问题。

4

1 回答 1

1

我想知道为什么会发生这种变化。

服务器可以自由地从组中选择任何值,但实际上它会选择它找到的第一个值。如果你有一个索引,symbol那么它将选择第一个,因为它们在索引中排序。如果您删除该WHERE子句,它将使用另一个索引或聚集键。这将以不同的顺序排序,因此服务器遇到的第一行将不同。

基本上你不应该依赖获得任何特定的价值。正如文档所说,服务器可以自由选择任何值,并且没有指定它选择的值。

是否有一个快速的解决方案来持续获得每个月的第一个值?

SELECT symbol, MIN(date) AS date
FROM pricedata
GROUP BY symbol, month(date), year(date)
于 2012-08-25T22:29:32.160 回答