2014-03-03 3 views
0

시간에 따라 테이블에 일련의 MySQL 데이터 포인트가 있습니다. 간격은 초당 1이고 사용 가능한 제한은 최대 30000 초라고 가정합니다. 값은 시간 값이 증가 할 때마다 항상 동일하거나 감소하며 기하 급수적으로 감소합니다 (시작하기 위해 빠르다가 끝까지 느리게). 정확한 비율은 설정되거나 알려지지 않았습니다. 따라서 예 :Mysql, 시간 간격으로 고유 한 값 계산

duration_seconds, value 
1, 900 
2, 898 
3, 897 
... 
1000, 300 
1001, 300 
1002, 299 
1003, 299 
... 
15000,100 
.. 
20000,99 
.. 
30000,99 

처음에는 숫자가 항상 고유하거나 1 초당 고유 값입니다. 중간에는 분당 30 개의 고유 값이있을 수 있습니다. 마지막에는 30 분당 1 개의 고유 값이있을 수 있습니다.

이 곡선을 시뮬레이션하기에 충분한 범위에서 분당 고유 값의 수를 결정하고 싶습니다. 고유 한 값만 저장하면되지만 모든 데이터를 삽입하는 빈도를 알고 싶습니다.

기본적으로 30000까지의 시간 간격에 대해 하나의 쿼리를 사용하고 싶습니다. 300 초 등. 그리고 각 범위에서 고유 한 값의 수를 얻습니다. 내가 사용할 수있는 그룹화 방법이 있나요?

SELECT 0,300,count(distinct value) FROM data WHERE duration_seconds >= 0 AND duration_seconds <= 300; 
SELECT 300,600,count(distinct value) FROM data WHERE duration_seconds >= 300 AND duration_seconds <= 600; 
SELECT 600,1200,count(distinct value) FROM data WHERE duration_seconds >= 600 AND duration_seconds <= 1200; 
... 

변경 비율에 따라 이상적인 범위를 어떻게 결정합니까? 예를 들어, 0-300은 시작하는 것이 좋지만 1200-3600은 아마 중간에 더 좋을 것이고 20000-30000은 결국 끝내는 것이 가장 좋을 것입니다.

답변

2

당신은 모든 300 개 단위의 범위의 값을 찾기 위해 다음과 같은 것을 할 수 있어야

SELECT (duration-1) DIV 300 * 300 AS low 
    , (duration-1) DIV 300 * 300 + 300 AS high 
    , COUNT(DISTINCT value) 
FROM data 
GROUP BY low, high 
ORDER BY low, high;