2014-04-25 5 views
0

저는 SQL의 기초를 알고 있습니다. 나는 사람이 사무실에 들어 왔을 때와 그가 떠날 때를 보여주는 데이터베이스를 가지고있다.MySQL 그룹화 합계

예를 들어

Name  Enter     Exit 
Jack  2014-01-01 01:00:00  2014-01-01 02:00:00 
Sam  2014-01-01 02:00:00  2014-01-01 03:00:00 
Jane  2014-01-01 02:00:00  2014-01-01 03:00:00 
Judy  2014-01-01 03:00:00  2014-01-01 04:00:00 

내가, 시간 단위 사무실에 있던 시간 그룹화, 어쩌면 너무 날짜별로 그룹화 사용자의 총 수를 알 수있다 할 노력하고 있어요, 그래서 내 결과 단지 시간을 수집하고 분을 폐기에

date   hour Occupancy 
2014-01-01  1  1 
2014-01-01  2  3 
2014-01-01  3  3 
2014-01-01  4  1 

**** 편집과 같아야하는 것은

나는 데이터베이스를 설정할 수 있습니다, 그러나 사람이 들어올 수 후 2 일 떠나 너무. 그래서 나는 한 시간 만에 출입하는 것이 아닌 뭔가를 찾고 있습니다.

+0

http://sqlfiddle.com/에서 테스트 케이스를 설정 한 다음 시도를 보여주고 결과를 여기에서 다시 공유하십시오. – crowne

+0

WHILE LOOP (EnterValue <= ExitValue) SELECT 문을 사용하여 날짜, 시간, 카운트를 얻은 다음 시간을 늘리십시오. 인터벌 1 시간은 좋은 논리적 시작이 될 것입니다. – Hituptony

답변

1

업데이트 답 :

좋아, 나는 같은 날에없는 입력하고 종료 날짜 사례를 반영하고 Enter를 종료 시간이 한 시간 이상에 차이 샘플 데이터를 조정.

CREATE TABLE t 
    (`Name` varchar(4), `Enter` datetime, `Exit` datetime) 
; 

INSERT INTO t 
    (`Name`, `Enter`, `Exit`) 
VALUES 
    ('Jack', '2014-01-01 01:00:00', '2014-01-01 02:00:00'), 
    ('Sam', '2014-01-01 02:00:00', '2014-01-01 05:00:00'), 
    ('Jane', '2014-01-01 02:00:00', '2014-01-01 03:00:00'), 
    ('Judy', '2014-01-01 03:00:00', '2014-01-03 04:00:00') 
; 

일을 쉽게하기 위해 샘플 데이터를 다루는 날짜 범위가 포함 된 표를 만들었습니다.

이 빠른 해킹은 우리 테이블에 66 개의 숫자를 삽입했습니다. 다음으로 샘플 데이터를 다루는 날짜를 생성합니다.

update n 
set b = '2014-01-01 00:00:00' + interval a hour; 

이제 우리는 우리가 단순히 조인이 테이블을 사용할 수 2014-01-01 00:00:002014-01-03 18:00:00 사이마다 전체 시간 날짜 시간 값이 있는지 확인하십시오.

select date(n.b), hour(n.b), count(*) 
from 
t inner join n on n.b between t.Enter and t.Exit 
group by 1, 2 

이렇게하면 입력 시간과 종료 시간 사이에 1 시간마다 기록을 얻습니다. 결과는 다음과 같습니다.

|  DATE | HOUR | COUNT(*) | 
|------------|------|----------| 
| 2014-01-01 | 1 |  1 | 
| 2014-01-01 | 2 |  3 | 
| 2014-01-01 | 3 |  3 | 
| 2014-01-01 | 4 |  2 | 
| 2014-01-01 | 5 |  2 | 
| 2014-01-01 | 6 |  1 | 
| 2014-01-01 | 7 |  1 | 
| 2014-01-01 | 8 |  1 | 
| 2014-01-01 | 9 |  1 | 
| 2014-01-01 | 10 |  1 | 
| 2014-01-01 | 11 |  1 | 
| 2014-01-01 | 12 |  1 | 
| 2014-01-01 | 13 |  1 | 
| 2014-01-01 | 14 |  1 | 
| 2014-01-01 | 15 |  1 | 
| 2014-01-01 | 16 |  1 | 
| 2014-01-01 | 17 |  1 | 
| 2014-01-01 | 18 |  1 | 
| 2014-01-01 | 19 |  1 | 
| 2014-01-01 | 20 |  1 | 
| 2014-01-01 | 21 |  1 | 
| 2014-01-01 | 22 |  1 | 
| 2014-01-01 | 23 |  1 | 
| 2014-01-02 | 0 |  1 | 
| 2014-01-02 | 1 |  1 | 
| 2014-01-02 | 2 |  1 | 
| 2014-01-02 | 3 |  1 | 
| 2014-01-02 | 4 |  1 | 
| 2014-01-02 | 5 |  1 | 
| 2014-01-02 | 6 |  1 | 
| 2014-01-02 | 7 |  1 | 
| 2014-01-02 | 8 |  1 | 
| 2014-01-02 | 9 |  1 | 
| 2014-01-02 | 10 |  1 | 
| 2014-01-02 | 11 |  1 | 
| 2014-01-02 | 12 |  1 | 
| 2014-01-02 | 13 |  1 | 
| 2014-01-02 | 14 |  1 | 
| 2014-01-02 | 15 |  1 | 
| 2014-01-02 | 16 |  1 | 
| 2014-01-02 | 17 |  1 | 
| 2014-01-02 | 18 |  1 | 
| 2014-01-02 | 19 |  1 | 
| 2014-01-02 | 20 |  1 | 
| 2014-01-02 | 21 |  1 | 
| 2014-01-02 | 22 |  1 | 
| 2014-01-02 | 23 |  1 | 
| 2014-01-03 | 0 |  1 | 
| 2014-01-03 | 1 |  1 | 
| 2014-01-03 | 2 |  1 | 
| 2014-01-03 | 3 |  1 | 
| 2014-01-03 | 4 |  1 | 

물론 도움 테이블을 조정해야합니다. 분명히 주위의 테이블을 돕는 것은 나쁜 것이 아닙니다.

다시 여기에 sqlfiddle이 있습니다.


원래 답 :

select date(a), hour(a), count(*) from ( select enter as a from t union all select `exit` as a from t ) b group by 1, 2 
  • 가 특정 가정이 있다는 것을, 불구하고 sqlfiddle

주에 살고 작업을 참조하십시오.

  1. 시간은 항상
  2. 를 입력하고 종료 날짜가 같은 날에 항상 전체 시간에 있습니다
  3. 입력하고 종료 시간은 한 시간 만에 다른

이러한 가정 중 하나가 사실이 아니라면 훨씬 복잡해집니다.

+0

만약 그들이 한 시간 만 떨어져 있다면 멋지 네요. 만약 OP가 그의 예를 안다면 모두 한 시간이고, 이것이 표준이라면 .. – Hituptony

+1

@Hituptony 나는 그것을 알고 내 대답에서 언급했다. 사람들은 자신의 질문에서 묘사하는 것을 얻습니다 :) 질문하는 법만을 배우는 것이 아니라 문제를 분석 할 때주의해야 할 좋은 방법입니다. 따라서 샘플 데이터도 고려해야합니다. – fancyPants

+0

나는 분석가이며, 분석가로서 나의 규칙 중 하나는 결코 생각하지 않는다. 하하 ... 나는 당신의 모든 의견에 전적으로 동의합니다. :) – Hituptony