Perl 스크립트에서 무언가를 시도했지만 SQL을 통해 직접 수행하는 더 쉽고 빠른 방법이 있는지 궁금합니다.
첫째, 다음은 값을 가져 오는 표의 추출입니다 (시간 열은 타임 스탬프 임).
| Computer | TIME | CPU |
| Computer-1 | 1418115601 | 67 |
| Computer-2 | 1418115601 | 31 |
| Computer-1 | 1418115601 | 39 |
| Computer-2 | 1418115601 | 39 |
| Computer-1 | 1418115601 | 37 |
| Computer-2 | 1418115601 | 38 |
| Computer-1 | 1418115601 | 54 |
| Computer-2 | 1418115601 | 0 |
| Computer-1 | 1418115601 | 52 |
| Computer-2 | 1418116501 | 28 |
| Computer-1 | 1418116501 | 30 |
| Computer-3 | 1418116501 | 33 |
| Computer-1 | 1418116501 | 23 |
| Computer-2 | 1418116501 | 5 |
| Computer-2 | 1418116301 | 5 |
이제이 테이블에 500 또는 600K 행이 있습니다. 그래프를 만드는 데 사용합니다. Perl 스크립트에서 값을 검색 한 다음 그래프를 생성합니다. 문제는 이러한 조치가 5 분마다 수행된다는 것입니다. 따라서 하루 종일 그래프를 생성하면 컴퓨터 당 288 개의 "포인트"((60/5) * 24)를 갖게됩니다.
내 질문은 내 그래프에 대해 더 큰 세분화를 원한다면 96 포인트 (15 분마다 한 측정 값)라고 가정 해 보겠습니다. 어떻게해야합니까?
이 경우 "모든 동일한 ID (이 경우 컴퓨터)에 대해 마지막으로 찾은 3 개의 값을 가져 와서 (문제가 없을 것이므로 날짜별로 주문)"평균을 내고 평균을내는 방법을 찾아야합니다. 결과를 줘 ".
문제는 어떻게해야할지 모르겠고, TIME 열도 문제가 될 수 있다는 것입니다. 그는 그것으로 무엇을 할 것인가? "CPU의 마지막 3 개 값을 평균화 한 후 마지막 행의 TIME이 새로운 평균 행을 채우도록 두십시오"와 같은 정확한 것이 가능합니까? 또는 실제로 시간을 평균화 할 수도 있지만 여전히 작동합니다 ...
미리 감사드립니다 :)
편집하다 :
일부는 출력의 예를 원했기 때문에 여기에 있습니다. (이 예에서는 컴퓨터가 2 대이고 각각에 대해 6 개의 값만 있다고 상상합니다)
정상적인 요청으로 나는 이것을 가질 것입니다
mysql> SELECT Computer, TIME, CPU FROM myTable order by date;
| Computer | TIME | CPU |
| Computer-1 | 1418115601 | 10 |
| Computer-2 | 1418115601 | 30 |
| Computer-1 | 1418115701 | 15 |
| Computer-2 | 1418115701 | 40 |
| Computer-1 | 1418115801 | 15 |
| Computer-2 | 1418115801 | 50 |
| Computer-1 | 1418115901 | 12 |
| Computer-2 | 1418115901 | 50 |
| Computer-1 | 1418116101 | 10 |
| Computer-2 | 1418116101 | 40 |
| Computer-1 | 1418116201 | 11 |
| Computer-2 | 1418116201 | 35 |
그리고 동일한 ID (컴퓨터)를 가진 마지막 3 개 값의 평균을 원합니다.
| Computer | TIME | CPU |
| Computer-1 | 1418115801 | 13.33 |
| Computer-2 | 1418115801 | 40 |
| Computer-1 | 1418116201 | 11 |
| Computer-2 | 1418116201 | 41.66 |
MySQL에서 사용할 수없는 분석 함수 ROW_NUMBER () OVER (PARTITION BY)를 모방해야합니다. MySQL에서 변수를 사용합니다.
컴퓨터 당 행 번호를 0, 1, 2, 3, 4, 5, 6 등으로 매 깁니다. 그런 다음 3으로 나누어 0, 0, 0, 1, 1, 1, 2 등을 얻습니다. 따라서 그룹화 기준을 얻습니다. 집계 대상 :
select computer, max(time), avg(cpu)
from
(
select
@row_number := case when @computer = computer then @row_number + 1 else 0 end as row_number,
@computer := computer as computer,
time,
cpu
from mytable
cross join (select @row_number := -1, @computer := '') as t
order by computer, time
) as t
group by computer, row_number div 3
order by computer, row_number div 3;
Pinal Dave의 블로그에서 row_number 기법을 찾았습니다. http://blog.sqlauthority.com/2014/03/09/mysql-reset-row-number-for-each-group-partition-by-row-number/
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다