programing

집계 함수가 있는 MySQL 쿼리에서 그룹화된 레코드의 첫 번째 레코드와 마지막 레코드를 가져오는 방법은 무엇입니까?

telecom 2023. 10. 7. 09:24
반응형

집계 함수가 있는 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

반응형