2011-04-22 85 views
0

假设您每天都有一个包含股票时间系列的表格。 现在您需要每周过滤一个数据点,因为您需要每周数据进行一些分析。你不必每周都有平均数,因为这会使大部分变化都消失。从每日数据中筛选每周并选择本周的第一次出现

这将是我最初的方法,但不清楚哪一个数据点落在给定的一周被选中。

SELECT date, price from stock_series 
GROUP BY WEEK(date) 

1我该如何确定它始终是获得采摘的给定星期内存在的第一个数据点?

编辑:

2如果上述查询呆事情是这样的 - 这数据点被每周选择?这种情况下的MySQL逻辑是什么?还是只是不可预测?

+0

家伙,请还解决了第二个问题我在主帖中添加。 – Steve06 2011-04-22 05:39:52

回答

2

如果你想拥有了它更好的控制,你可以尝试使用子查询:

SELECT date,price 
FROM stock_series 
WHERE date IN 
(
SELECT MIN(inner.date) 
FROM stock_series inner 
GROUP BY WEEK(inner.date) 
) GROUP BY date 

我在主查询中添加GROUP BY日期,因为你可能有不止一个每天进入,否则可能被忽略。

编辑:

,或者尝试用它连接:

SELECT date,price 
FROM stock_series 
JOIN 
(
SELECT MIN(date) AS innerdate 
FROM stock_series 
GROUP BY WEEK(date) 
) inner ON date=innerdate; 
+0

我认为最后一个GROUP BY日期必须剩下出来,不是吗? – Steve06 2011-04-22 05:45:17

+0

就像我写的,如果你每个日期只有一个价格,那么是的。至于第二部分,我在mysql文档中发现:“服务器可以自由地从组中返回任何值,所以除非所有值都相同,否则结果是不确定的。” http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html – trakos 2011-04-22 05:50:04

+0

我只是试图在一个庞大的数据集上使用大约10个连接的表,它需要永远完成。感觉就像它一次又一次地运行你的子查询。你知道如果没有子查询的AndrewR的其他建议也可以做到这一点吗? – Steve06 2011-04-26 05:39:55

1

您可以按日期升序排序,这应该只给出WEEK()组的第一个结果。

SELECT date,price from stock_series 
GROUP BY WEEK(date) 
ORDER BY date 
+0

真的很简单吗?如果真是太棒了 - 有人可以证实吗? – Steve06 2011-04-22 05:49:09

+0

'WEEK(date)'返回不同年份的同一周,你最好由'ROUND(UNIX_TIMESTAMP(date)/ 60/60/24/7)组合' – 2015-11-02 10:14:01