집계 함수가 있는 MySQL 쿼리에서 그룹화된 레코드의 첫 번째 레코드와 마지막 레코드를 가져오는 방법은 무엇입니까?
저는 '그룹화된' 기록의 첫 번째와 마지막 기록을 가져오려고 합니다.
좀 더 정확하게 말하자면, 저는 이런 질문을 하고 있습니다.
SELECT MIN(low_price), MAX(high_price), open, close
FROM symbols
WHERE date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)
하지만 그 그룹의 첫번째와 마지막 기록을 갖고 싶습니다.수많은 요청을 해야 할 수도 있지만, 제가 자리가 꽤 큽니다.
MySQL로 이 작업을 수행할 수 있는 (가능한 경우 낮은 처리 시간) 방법이 있습니까?
사용하고 싶으십니다.GROUP_CONCAT
그리고.SUBSTRING_INDEX
:
SUBSTRING_INDEX( GROUP_CONCAT(CAST(open AS CHAR) ORDER BY datetime), ',', 1 ) AS open
SUBSTRING_INDEX( GROUP_CONCAT(CAST(close AS CHAR) ORDER BY datetime DESC), ',', 1 ) AS close
이렇게 하면 값비싼 하위 쿼리를 피할 수 있고 이 특정 문제에 대해 일반적으로 더 효율적이라고 생각합니다.
두 함수의 수동 페이지를 확인하여 인수를 이해하거나 MySQL에서 시간 간격 변환을 수행하는 방법의 예를 포함한 이 기사를 참조하여 더 많은 설명을 얻을 수 있습니다.
시작하기 위해 시도... :
Select YearWeek, Date, Min(Low_Price), Max(High_Price)
From
(Select YEARWEEK(date) YearWeek, Date, LowPrice, High_Price
From Symbols S
Where Date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)) Z
Group By YearWeek, Date
다음은 이 특정 문제에 대한 훌륭한 구체적인 해결책입니다. http://topwebguy.com/first-and-last-in-mysql-a-working-solution/ MySQL에서 FIRST와 LAST를 사용하는 것만큼 간단합니다.
실제로 해결책을 제공하는 코드를 포함시키겠지만 전체 텍스트를 조회할 수 있습니다.
SELECT
word ,
(SELECT a.ip_addr FROM article a
WHERE a.word = article.word
ORDER BY a.updated LIMIT 1) AS first_ip,
(SELECT a.ip_addr FROM article a
WHERE a.word = article.word
ORDER BY a.updated DESC LIMIT 1) AS last_ip
FROM notfound GROUP BY word;
가장 낮은_가격과 가장 높은_가격을 가진 레코드의 ID를 원한다면 이 두 열을 쿼리에 추가할 수 있습니다.
SELECT
(SELECT id ORDER BY low_price ASC LIMIT 1) low_price_id,
(SELECT id ORDER BY high_price DESC LIMIT 1) high_price_id,
MIN(low_price), MAX(high_price), open, close
FROM symbols
WHERE date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)
효율성이 문제라면 'year_week' 열을 추가하고 커버링 인덱스를 추가한 후 쿼리를 두 개로 분할해야 합니다.
'year_week' 열은 YEARWEEK(날짜) 값으로 설정된 INT일 뿐이며 '날짜' 열이 업데이트될 때마다 업데이트됩니다.이렇게 하면 각 쿼리마다 다시 계산할 필요가 없고 색인을 작성할 수 있습니다.
새로운 커버링 지수는 이렇게 보여야 합니다.주문이 중요합니다.KEYw_lp_id(년_주, 저가, id), KEYw_hp_id(년_주, 고가, id)
그런 다음 이 두 개의 쿼리를 사용해야 합니다.
SELECT
(SELECT id ORDER BY low_price ASC LIMIT 1) low_price_id,
MIN(low_price), open, close
FROM symbols
WHERE year_week BETWEEN(.. ..)
GROUP BY year_week
그리고.
SELECT
(SELECT id ORDER BY high_price DESC LIMIT 1) high_price_id,
MAX(high_price), open, close
FROM symbols
WHERE year_week BETWEEN(.. ..)
GROUP BY year_week
커버링 인덱스는 꽤 유용합니다.자세한 사항은 이것을 확인해 보세요.
언급URL : https://stackoverflow.com/questions/1379565/how-to-fetch-the-first-and-last-record-of-a-grouped-record-in-a-mysql-query-with
'programing' 카테고리의 다른 글
x86에서 스왑 대 비교 및 스왑 잠금의 상대적 성능 (0) | 2023.10.07 |
---|---|
jQuery.get()으로 시간 초과 (0) | 2023.10.07 |
UI 이미지 크기를 200x200pt/px로 조정 (0) | 2023.10.07 |
열에서 텍스트를 찾는 방법 및 처음 찾은 행 번호 저장 - Excel VBA (0) | 2023.10.02 |
모듈을 가져왔는지 확인하려면 어떻게 해야 합니까? (0) | 2023.10.02 |