2013-01-12 5 views
1

우선 그 제목에 대해 사과드립니다. 그러나 설명하는 방법을 모르겠습니다.여러 열의 날짜순으로 그룹화 하시겠습니까?

내 테이블에 세션을 저장하고 있는데 얼마나 많은 세션이 있었는지 시간당 세션 수를 얻고 싶습니다. 하루 동안 활동적입니다. 세션은 두 개의 시간 소인 start와 end에 의해 지정됩니다.

잘하면 도와 줄 수 있습니다. 여기

우리가 간다 : http://sqlfiddle.com/#!2/bfb62/2/0

+0

스키마와 데이터 세트로 www.sqlfiddle.com 예제를 만들 수 있습니까? – Martin

+0

하루 동안 활동적으로 시작일과 종료일이 같은 날에 있었던 것을 의미합니까? 또는 시작일 또는 종료일? COUNT 연산자로하기 쉬워야합니다. – sgeddes

+0

매시간 시작 시간은 이전이어야하며 종료 시간은 그 시간 이후 여야합니다. 내 where 절에서이를 어떻게 사용할 수 있습니까? –

답변

0

당신이하고 싶은 것이 MySQL에서는 다소 어렵습니다. 그러나 너무 어려움없이 근사값을 얻을 수 있습니다. 다음은 하루 안에 시작하고 중지하는 사용자를 계산합니다.

select date(start), hour, 
     sum(case when hours.hour between hour(start) and hours.hour then 1 else 0 
      end) as GoodEstimate    
from sessions s cross join 
    (select 0 as hour union all 
     select 1 union all 
     . . . 
     select 23 
    ) hours 
group by date(start), hour 

사용자가 여러 날에 걸쳐있을 경우 쿼리가 더 어려워집니다. 다음은 매시간 시작하는 사용자가 있다고 가정하는 한 가지 방법입니다.

select thehour, count(*) 
from (select distinct date(start), hour(start), 
      (cast(date(start) as datetime) + interval hour(start) hour as thehour 
     from sessions 
    ) dh left outer join 
    sessions s 
    on s.start <= thehour + interval 1 hour and 
     s.end >= thehour 
group by thehour 

참고 :이 코드는 테스트되지 않았으므로 구문 오류가있을 수 있습니다.

+0

와우 감사합니다! 그러나 내가보기에 만약 내가 이해할 수 없기 때문에 내가 일을 할 수없는 큰 쿼리를 작성하는 대신에 24 개의 쿼리를 실행해야한다고 생각합니다 : p이 작업을 수행하는 데 약간의 트릭 만 있기를 바랬습니다. 하지만 당신의 노력에 감사드립니다. –

1

난 아직도 당신이 COUNT, YEAR, MONTH, DAY를 사용하여 모양, 시작 및 종료 날짜를 비교하고 싶습니다 방법을 잘 모르겠어요 동안, 그리고 HOUR, 당신은 할 수 원하는 결과를 얻으십시오. 이와 유사한

아마 뭔가 :

SELECT COUNT(ID), YEAR(Start), HOUR(Start), DAY(Start), MONTH(Start) 
FROM Sessions 
GROUP BY YEAR(Start), HOUR(Start), DAY(Start), MONTH(Start) 

그리고 SQL Fiddle.

+0

안녕하세요, 고맙습니다. 그러나 이것이 해결책이라고 생각하지 않습니다.문제는 세션이 특정 시간에 활성화되었는지를 알기 위해 종료 시간도 확인해야한다는 것입니다. 다음 예제를 참조하십시오. http://sqlfiddle.com/#!2/e343d/1/0 3이 아니기 때문에 잘못되었으므로 2가 아닙니다. –

+0

원하는 결과는 무엇입니까? 나는 아직 완전히 이해하지 못하고있다. – sgeddes

+0

죄송합니다. 마지막 sqlfiddle을 가져 가자. 17:00에 활성화 된 세션이 3 개이므로 XXXX 17:00에 값 3을보고 싶습니다. 사용자 세션에 대해 생각해 본다면 01:00, 02에 얼마나 많은 사용자가 있었는지 간단히 알기 만하면됩니다. : 00 등. –

0

좋습니다. 인덱스 테이블이 복구되는 또 다른 문제입니다.

인덱스 테이블은 모든 사람이 툴킷에 포함시켜야하는 항목입니다. 마스터 테이블에 저장하는 것이 좋습니다. id int primary key 단일 열이 0에서 n까지의 연속 된 숫자를 포함하는 테이블입니다. 여기서 n은 필요한 것을 수행하기에 충분히 큰 숫자이고, 100,000은 좋고, 1,000,000이 더 좋습니다. 이 테이블을 한 번만 만들면되지만 여러 번 사용할 수 있습니다.

문제의 경우 각 시간을 고려해야하며, 문제를 이해하면 시간이 끝나기 전에 시작된 모든 세션을 계산해야하며 그 시간이 시작되기 전에 끝나지 않았습니다.

해결 방법은 SQL fiddle입니다.

인덱스 테이블의 알려진 일련 번호를 사용합니다 (이 피들은 0에서 100까지 - 4 일이 지나면 큰 n이 필요한 이유를 알 수 있습니다). . 시간.

관련 문제