mysql - 如何写一条SQL,分时段统计结果?
PHP中文网
PHP中文网 2017-04-17 16:43:41
0
6
685

比如时间是过去24小时,将这过去24小时分成10等分,一条SQL查询出10条记录,也就是每个时间段的统计结果。
一条SQL可以实现上述的需求吗?谢谢:-)

我想到一种办法,将这10条SQL用union拼接起来,请问一下还有其他的办法吗?

我的SQL是:

select sum(num) from T where time >= xx and time <= yy;

现在是要将[xx, yy]时间分成10等分,返回各个时间段的统计结果

PHP中文网
PHP中文网

认证0级讲师

모든 응답(6)
Peter_Zhu

경우에 따라 하나의 SQL

  • 필요에 맞게 case when을 사용할 수는 없을까요? 하나의 SQL로 모든 작업을 완료하세요! ! ! !

sum(time >= xx이고 time < xx + (yy - xx) / 10이면 1 else 0 end인 경우)를 time_1로 선택하고, sum(time > = xx + (yy - xx) / 10 및 시간 < xx + 2 * (yy - xx) / 10 then 1 else 0 end) as time_2, sum(case when time >= xx + 2 * (yy - xx) / 10 and time = xx + (i -1) * (yy - xx) / 10 및 time 

더 나은 유지관리

  • 시간 빼기에 주의하세요. 위의 SQL을 캡슐화하고 startTime, 를 받으려면 저장 프로시저를 사용하는 것이 좋습니다. endTime합계와 등분수로 구성된 세 가지 매개변수, 계산 각 간격의 시작 및 종료 시간을 계산합니다(내 SQL은 전면 닫힘과 열기를 사용하지만 마지막 균등 분할은 종료 시간과 동일해야 합니다!!! 그렇지 않으면 endTime과 동일한 1이 손실됩니다. 값은 계산되지 않습니다). 그러면 해당 값이 실행을 위해 SQL로 전달됩니다. 이런 방식으로 각 호출마다 하나의 저장 프로시저만 호출하면 됩니다.

꼭 이렇게 해야 하나요?

사실 귀하의 구체적인 비즈니스 시나리오는 모르지만 상황에 따라 선택하겠습니다

  • startTimeendTime 사이에 찾은 데이터가 크지 않거나 데이터베이스의 총량이 많지 않다면 2층을 추천합니다 @Paul_Ding의 진술.

  • 그러나 데이터베이스의 레코드가 매우 크거나 startTimeendTime을 기준으로 수십만 개의 레코드를 찾는 경우가 많다면 권장됩니다. SQL을 사용하면 매번 처리하기 위해 네트워크를 통해 코드로 너무 많은 레코드를 전송할 필요가 없습니다. 그러나 간단한 프로그래밍과 계산이 필요한 이러한 종류의 SQL의 경우 이를 캡슐화하는 것이 좋습니다. 저장 프로시저 일부 유지

  • 위의 두 가지 방법에 관계없이 실제로는 복잡성을 전달하는 것일 뿐입니다. 문제를 해결하려면 더 복잡한 코드나 더 복잡한 SQL을 사용하는 것 외에는 아무 것도 없습니다. 귀하의 비즈니스 시나리오에 따라 올바른 것을 선택하십시오.

Peter_Zhu

동등시간 함수로 그룹화

巴扎黑

24시간 데이터를 확인 후 분할하는 것이 좋습니다. 이렇게 하면 비용도 적게 들고 SQL을 사용할 필요도 없습니다.

伊谢尔伦

이전에는 다음 작업을 수행했습니다.
1. 이 기간 [xx, yy]와 등분수 N을 기반으로 시간 세그먼트 임시 테이블 Split_time_table을 만듭니다.
id start_time 1 2017-01-12 00:00:00
2 2017-01-12 02:24:00
3 2017-01-12 04:48:00

...

10 2017-01-12 21:36:00
(이 임시 테이블을 만드는 방법이 있습니다. id에 대한 기본 키를 만드는 것을 잊지 마세요)
2. 이 임시 테이블을 무엇과 연결하세요. 테이블 T를 확인하고 싶습니다

t1.date_time,sum(t2.num)을 선택하세요.
  Split_time_table t1에서
    t2.time>=t1.start_time 및 t2.time

위의 144는 (yy-xx)/N으로 계산됩니다. 위의 예는 하루 24시간을 10등분한 것을 기준으로 합니다.

실습 가능한 방법입니다. 일부 변수는 매개변수를 전달하여 동적으로 계산할 수 있습니다.

迷茫

층별로 그룹화(mod(time, 86400)/8640)

洪涛

오라클의 방식과 아이디어에 대해 이야기해보겠습니다. 이 요구 사항의 어려움은 이를 10개의 동일한 부분으로 나누는 것입니다. 언제 사용하더라도 여전히 시작 시간 + 동일 기간1, 시작 시간 + 동일 기간2, 시작 시간이 필요합니다. + 동일 부분 기간 *3...
oracle의 계층적 쿼리를 사용하면 허공에서 1, 2, 3...10을 생성할 수 있습니다.
코드는 다음과 같습니다: 피>

SELECT LEVEL 번호
  듀얼에서
레벨 
로 연결

인용정보
얻은 숫자를 재사용하여 기간(간격)을 곱하여 미리 계산해 보세요

select sum(begintime+(level-1)*interval
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿