2012-04-10 3 views
0

일일 MySQL 테이블에서 주간 (예 : Mon-Sun, 모드 = 1 매개 변수 YEARWEEK) 값을 재고로 가져 오려고합니다. 낮음, 높음, 열림 및 닫힘 값.MySQL GROUP BY YEARWEEK가 처음으로 작동하지 않습니다.

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

당신이 할 수있는 것처럼 예를 들어

, 다음 쿼리는 제대로 나에게 월 1 일 2012 년 사이의 주 동안가는 곳마다 3 월 1 일 2012 제공 모든 날짜가 정확하게 (결과의 더 낮은 범위 인 첫 번째 것 외에도) 월요일 - 일요일 주 첫날 인 월요일을 지정합니다. 그러나

, 내가 먼저 소개하고 (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

실제로 첫 번째 쿼리는 이미 엉망입니다. 날짜를 선택하고 몇 주 단위로 그룹화합니다. 같은 방식으로 생각하십시오 : 같은 주에 두 개의 날짜가있는 경우 어떤 날짜가 표시 될 것으로 예상합니까?

귀하의 옵션은 YEARWEEK(date, 1)을 선택하거나 그룹화하고 date을 선택하여 그룹화하는 것입니다.

Btw에 포함 된 테이블과 데이터 및 예상 결과에 대한 자세한 정보를 제공하는 것이 좋습니다. 내가 가지고 올 수 있었다

+0

답장을 보내 주셔서 감사합니다! 선택해야하는 날짜는 관찰 기간의 첫 번째 날짜로, 월요일이거나, 주어진 첫날이 월요일이 아닌 경우 그 날 (첫 번째 결과와 마찬가지로 두 번째 것과 다름)입니다. 이 경우 날짜에 관한 한 정확히 선택해야하는 것은 무엇입니까? – user1094786