2017-09-20 1 views
1

I는 다음과 같습니다 데이터 집합 도착에 시간 간격에 :그룹 마지막으로 삽입 된 기록

localDateTime  |bid 
--------------------|-------- 
2017-09-17 15:35:05 |3085  
2017-09-17 15:35:54 |3100  
2017-09-17 15:37:05 |3100.2 
2017-09-17 15:38:06 |3101.6 
etc.. 

나는 시간 필드에 의해 그룹이 원하는 각 시간 간격의 MAX (openBid)을 얻고 있습니다를 마지막 5 간격 (이 예에서는 5 분).

SELECT 
    MIN(localDateTime) startTime 
    ,MAX(bid) maxOpenBid 
    ,COUNT(*) countRecords 
FROM 
    Ticker 
GROUP BY 
    UNIX_TIMESTAMP(localDateTime) DIV 300 
ORDER BY ID DESC 
LIMIT 5 

이것은 folowing 결과를 제공합니다 : :이 쿼리를 사용

startTime   |maxOpenBid |countRecords 
--------------------|-----------|------------ 
2017-09-20 10:50:03 |3306.9  |3   
2017-09-20 10:45:03 |3305  |5   
2017-09-20 10:40:04 |3304.9  |5   
2017-09-20 10:35:04 |3306  |5   
2017-09-20 10:30:03 |3303.2  |5   

나는이 결과 집합의 첫 번째 레코드의 카운트가 시간이 지남에 따라 1 ~ 5까지 카운트한다는 것이다 문제 . 이 예제에서는 3입니다. 내 쿼리가 모든 시간 간격에 대해 동일한 양의 레코드를 갖기를 원합니다. 문제는 GROUP BY가 시간의 첫 번째 레코드에서 시작된다는 것입니다. ORDER BY DESC를하고 있기 때문에이 세트의 마지막 레코드에서 시작하고 싶습니다.

+0

내 개인적인 접근 방식은 타임 스탬프 (서비스 문제로 인해 누락 된 항목이 누락 될 수 있음)를 사용하는 것을 잊어 버리고 연속적인 자동 증가 숫자로 전환하는 것입니다. 게으른 경우 자동 증가 기본 키 (서버가 점프 1 씩 증가하도록 설정되어 있으면 MySQL 클러스터가이 접근 방식을 깨뜨릴 것입니다.) GROUP BY FLOOR (pk_column/5) – wally

+0

수행 할 수 있습니다. 내 접근 방식, 첫 번째 레코드를 "수정"하는 오프셋을 제공해야 할 수도 있습니다. 예를 들어 'GROUP BY FLOOR ((pk_column + 4)/5)' – wally

+0

그 생각을하지 않았다, 좋은 제안, 고마워! – NCS

답변

0

해결책을 찾았을 때, 올바른 방향으로 놓아 둡니다. 여기

내가 그것을 작동하도록 한 것입니다 :

SET @rownr =-1; 
SELECT 
    MIN(localDateTime) startTime 
    ,MAX(bid) maxOpenBid 
    ,COUNT(*) countRecords 
FROM 
    (
    SELECT 
     (@rownr := (@rownr+1)) rownr 
     ,ID 
     ,localDateTime 
     ,bid openBid 
     ,ask openAsk 
    FROM 
     Ticker 
    ORDER BY ID DESC 
    LIMIT 25 
    ) Ticker 
GROUP BY 
    FLOOR(rownr/5) 
ORDER BY ID DESC 
LIMIT 5 

"시세"에 대한 하위 쿼리를 사용하여 또한 PK의 지시 하위 집합을 생성하여 성능에 정말 큰 영향을 미쳤다.

관련 문제