2017-04-06 11 views
0

로 가입이 내 스키마입니다 : MySQL은 서브 쿼리

mysql> describe stocks; 
+-----------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-----------+-------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| symbol | varchar(32) | NO |  | NULL |    | 
| date  | datetime | NO |  | NULL |    | 
| value  | float(10,3) | NO |  | NULL |    | 
| contracts | int(8)  | NO |  | NULL |    | 
| open  | float(10,3) | NO |  | NULL |    | 
| close  | float(10,3) | NO |  | NULL |    | 
| high  | float(10,3) | NO |  | NULL |    | 
| low  | float(10,3) | NO |  | NULL |    | 
+-----------+-------------+------+-----+---------+----------------+ 
9 rows in set (0.03 sec) 

내가 열이 열려 낮은 추가 나는 테이블 내부의 데이터로 채워 싶다.

이러한 개폐 값은 매일 참조됩니다. (각 날의 상대 최대/최소 ID로 올바른 값을 제공해야 함). 그래서 내 첫 번째 통찰력 날짜의 목록을 얻을 수 있습니다 다음 테이블과 조인 왼쪽 :

SELECT DISTINCT(DATE(date)) as date FROM stocks 

하지만 최대/최소 ID 또는 첫 번째/마지막 값을 얻을 수 없기 때문에 나는 갇혔어요 . 감사합니다

답변

1

당신은 쿼리

SELECT DATE_FORMAT(date, "%d/%m/%Y"),min(id) as min_id,max(id) as max_id FROM stocks group by DATE_FORMAT(date, "%d/%m/%Y") 

아래에서 하루 현명 최소 및 최대 ID를 얻을 것이다 그러나 다른 요구 사항이 명확하지 않다.

+0

도움 주셔서 감사합니다. 이것은 min_id, max_id를 'value'열의 값으로 대체 한 다음 높은 열, 낮은 열에 삽입해야하는 첫 번째 단계입니다. – egariM

0

해결!

mysql> UPDATE stocks s JOIN 
    -> (SELECT k.date, k.value as v1, y.value as v2 FROM (SELECT x.date, x.min_id, x.max_id, stocks.value FROM (SELECT DATE(date) as date,min(id) as min_id,max(id) as max_id FROM stocks group by DATE(date)) AS x LEFT JOIN stocks ON x.min_id = stocks.id) AS k LEFT JOIN stocks y ON k.max_id = y.id) sd 
    -> ON DATE(s.date) = sd.date 
    -> SET s.open = sd.v1, s.close = sd.v2; 
Query OK, 995872 rows affected (1 min 50.38 sec) 
Rows matched: 995872 Changed: 995872 Warnings: 0