2012-01-31 4 views
0

하나의 행에서 생성 타임 스탬프를 사용하고 첫 번째 타임 스탬프를 기준으로 INTERVAL에서 '수정'타임 스탬프를 기준으로 고유 사용자 수를 계산하는 쿼리를 작성하려고합니다. 나는 출력을 얻지 만, 그것이 내가 기대하는 바가 아니다.다른 행을 참조하는 MySQL 쿼리

GROUP BY 또는 DATE_SUB 때문에 내가 할 수있는 일이 불가능하다는 느낌이 들었습니다. 이것은 내가 무엇을의 골격이다 :

이 쿼리의 목적은 작업 A에 대해, 나는 시간에 제작 한 그 일을보고, 활성 얼마나 많은 사용자 (노동자) 셀 수 있도록이다

SELECT jobid, ctime, date, foo.count 

FROM Table foo 

JOIN (
    SELECT 
     COUNT(DISTINCT user) AS count 

    FROM Table 

    WHERE mtime >= DATE_SUB(ctime, INTERVAL 12 HOUR) 

    GROUP BY window 
) bar ON foo.id = bar.id 

ORDER BY ctime 
지난 12 시간 동안 얼마나 많은 사람들이 그 기간에 다른 일자리를 '수정'했는지에 따라 이 같은 테이블 그러니까 기본적으로

:
jobid ctime  date foo.count 
2  10:00 AM 1st  1 
3  1:00 PM 2nd  0 
4  9:00 AM 3rd  1 
5  10:00 AM 3rd  2 

내 쿼리 바른 길에 나는 건가요 :

jobid userid ctime mtime  date 
1  Alan  9:00 AM 11:00 AM 1st 
2  Bob  10:00 AM 1:00 PM 1st 
3  Carla  1:00 PM 11:00 PM 2nd 
4  Dave  9:00 AM 10:00 AM 3rd 
5  Emma  11:00 AM 1:00 PM 3rd 

내 원하는 출력이 될 것이다? 아니면 내가 떠난거야?

는 편집 :

SELECT 
    ci.ctime AS "Job Creation Time", 
    ci.job_id AS "Job ID", 
    ci.pickup_time AS "Pickup Time", 
    HOUR(wt.ctime) AS "Active Window", 
    xx.Active AS "#Active in Window" 

FROM worker_to AS wt 
JOIN stats_ci_data ci ON ci.job_id = wt.id 
JOIN `order` o ON o.id = wt.order_id 

JOIN (
    SELECT 
     wt.id AS `id`, wt.ctime, 
     DATE(wt.ctime) AS `date`, 
     DATE_FORMAT(wt.ctime, '%m-%d-%H') AS win, 
     COUNT(DISTINCT wt.worker_id) AS "Active" 

     FROM worker_to wt 
     JOIN `order` o ON o.id = wt.order_id 

     WHERE wt.mtime BETWEEN DATE_SUB(wt.ctime, INTERVAL 12 HOUR) AND wt.ctime 
     AND wt.tier != "machine" 
     AND wt.preferred_worker_flag != '1' 
     AND o.source LIKE '%Mozilla%' 
     OR o.source LIKE 'Opera%' 
     OR o.source LIKE 'Firefox%' 

     GROUP BY win 
    ) xx ON xx.id = wt.id 

WHERE wt.tier != "machine" 
AND wt.preferred_worker_flag != "1" 
AND o.source LIKE '%Mozilla%' 
OR o.source LIKE 'Opera%' 
OR o.source LIKE 'Firefox%' 

ORDER BY ci.ctime, HOUR(wt.mtime) 
; 

그래서 내가 대신 내가 계층, preferred_worker, 소스처럼, '필터'의 무리에 넣어해야하기 때문에 두 번 같은 테이블에서 당겨 조인 사용. 나는 이것들이 질의를 늦추고 있다고 생각한다. 그러나 동시에, 나는 시간 간격이 나에게 맞는 숫자도주지 못한다고 느낀다. 현재 하위 쿼리 그룹은 DATE 개이지만 활성 직원 수는 1, 2, 3 일로 매우 낮습니다.

답변

0

귀하의 질문을 정확히 이해하고 있는지 잘 모르겠지만 귀하가 이와 같은 것을 원한다고 생각합니다. ctimemtime에 날짜와 시간이 포함되어 있습니까? 그렇지 않다면 아래의 SQL에서 날짜와 시간이 모두있는 표현식으로 바꿔야합니다. 그러나 이것은 적어도 당신을 시작하게해야합니다.

select this.jobid, this.ctime, this.date, count(*) 
from Table this, Table other 
where other.mtime between (this.ctime - interval 12 hours) and this.ctime 
    and this.userid != other.userid 
group by this.jobid, this.ctime, this.date 
+0

안녕하세요, David 님, 답장을 보내 주셔서 감사합니다. 네,'ctime'과'mtime' 둘 다 날짜와 시간이 있습니다. 나는'and this.userid! = ... '가 내가 찾고있는 것이라고 생각하지 않지만'BETWEEN' 연산자를 사용하려고합니다. 내가 얻는 숫자는 바뀌지 않는 것 같습니다. 나는 내일 전체 질의를 게시 할 것이며, 성취하고자하는 것을 더 잘 전달할 수 있기를 희망한다. – Murmur

관련 문제