2012-04-10 16 views
0

私は毎日持っているMySQLテーブルから株の値を毎週(Mon-Sunのようにmode = 1パラメータでYEARWEEKに指定されています)値を取得しようとしています低い値、高い値、開いた値および近い値。MySQLのGROUP BY YEARWEEKが最初に動作しません

例えば

、次のクエリは正しく私の月の第1回2012年3月1日2012年の間に数週間のための高値と安値を与える:

SELECT date, MIN(low), MAX(high) 
FROM daily_stock_values WHERE stock_id = SOMESTOCK 
AND date BETWEEN '2012-01-01' AND '2012-03-01' GROUP BY YEARWEEK(date, 1) 

この正しくは、出力:

+------------+-----------+-----------+ 
| date  | max(high) | min(low) | 
+-----------+-----------+-----------+ 
| 2012-01-01 | ......... | ......... | 
| 2012-01-02 | ......... | ......... | 
| 2012-01-09 | ......... | ......... | 
| 2012-01-16 | ......... | ......... | 
| 2012-01-23 | ......... | ......... | 
| 2012-01-30 | ......... | ......... | 
| 2012-02-06 | ......... | ......... | 
| 2012-02-13 | ......... | ......... | 
| 2012-02-20 | ......... | ......... | 
| 2012-02-27 | ......... | ......... | 
+------------+-----------+-----------+ 

することができますようにすべての日付が正確に(結果の下位範囲である最初のものに加えて)月曜日に指定されています。これは月曜日の週の最初の日です。しかし

、私が最初に導入し(hereが説明するように)だけでなく続くようにしてみてください。

SELECT date, MIN(low), MAX(high), 
SUBSTRING_INDEX(GROUP_CONCAT(CAST(open AS CHAR) ORDER BY date), ',', 1) AS open, 
SUBSTRING_INDEX(GROUP_CONCAT(CAST(close AS CHAR) ORDER BY date DESC), ',', 1) AS close 
FROM daily_stock_values WHERE stock_id = SOMESTOCK 
AND date BETWEEN '2012-01-01' AND '2012-03-01' GROUP BY YEARWEEK(date, 1) 

これは、残念ながら私のGROUP BYを台無しにし、日付はもう月曜日に整列されないように発生します

+------------+-----------+-----------+-----------+-----------+ 
| date  | max(high) | min(low) | open  | close  | 
+------------+-----------+-----------+-----------+-----------+ 
| 2012-01-01 | ......... | ......... | ......... | ......... | 
| 2012-01-08 | ......... | ......... | ......... | ......... | 
| 2012-01-15 | ......... | ......... | ......... | ......... | 
| 2012-01-22 | ......... | ......... | ......... | ......... | 
| 2012-01-29 | ......... | ......... | ......... | ......... | 
| 2012-02-05 | ......... | ......... | ......... | ......... | 
| 2012-02-12 | ......... | ......... | ......... | ......... | 
| 2012-02-19 | ......... | ......... | ......... | ......... | 
| 2012-02-26 | ......... | ......... | ......... | ......... | 
| 2012-02-27 | ......... | ......... | ......... | ......... | 
+------------+-----------+-----------+-----------+-----------+ 

ここでは何が起こっていますか?ありがとう!

答えて

2

最善の解決策は次のとおりです。
SELECT YEARWEEK(date, 1) AS ignore, MIN(date) as date

これは非常にうまく機能します!

0

実際には、最初のクエリは既に「混乱」しています。日付を選択し、数週間でグループ化しています。あなたは同じ週に2つの日付があった場合、どのような日付を表示することを期待していますか?

オプションは、YEARWEEK(date, 1)で選択してグループ化するか、dateで選択してグループ化することです。

Btwについては、含まれるテーブルやデータ、予想される結果に関する詳細情報を提供することを検討する必要があります。私が思い付くことができました

+0

返信いただきありがとうございます!私が選択する必要があるのは、観測期間中の最初の日付で、月曜日、または与えられた最初の日が月曜日でない場合(その日(2番目の結果とは違って最初の結果と同様))です。この場合、日付に関する限り、正確に何を選択すべきですか? – user1094786