1

毎日の安値、高値、始値、終値を含む MySQL テーブルから、毎週 (Mon-Sun のように、mode=1 パラメータで YEARWEEK に指定) の値を取得しようとしています。

たとえば、次のクエリは、2012 年 1 月 1 日から 2012 年 3 月 1 日までの週の高値と安値を正しく示します。

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 | ......... | ......... |
+------------+-----------+-----------+

ご覧のとおり、すべての日付は (結果の下位範囲である最初の日付を除いて) 月曜日を正しく指定しています。月曜日は月曜日から日曜日の週の最初の日です。

ただし、最初と最後も導入しようとすると (ここで説明されているように):

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 | ......... | ......... | ......... | ......... |
+------------+-----------+-----------+-----------+-----------+

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

4

2 に答える 2

3

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

これはかなりうまくいきます!

于 2012-04-12T15:54:41.563 に答える
0

実際、最初のクエリはすでに「台無し」になっています。日付を選択し、週ごとにグループ化しています。このように考えてみてください: 同じ週に 2 つの日付がある場合、どの日付が表示されると予想されますか?

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

ところで、それらに含まれるテーブルとデータ、および期待される結果に関する詳細情報を提供することを検討する必要があります。

于 2012-04-10T02:29:35.547 に答える