MySQL запрос, который ссылается на другие строки - PullRequest
0 голосов
/ 31 января 2012

Я пытаюсь сделать запрос, который берет «метку времени создания» из одной строки, затем подсчитывает количество уникальных пользователей на основе меток времени «модификации» в ИНТЕРВАЛЕ на основе первой метки времени. Я получаю вывод, но это не то, что я ожидаю.

У меня ощущение, что я пытаюсь сделать это невозможно, хотя из-за GROUP BY или DATE_SUB. Это скелет того, что у меня есть:

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

Цель этого запроса состоит в том, чтобы в задании A я мог посмотреть, когда было создано задание A, и подсчитать, сколько пользователей (рабочих) было активным за последние 12 часов, исходя из того, сколько из них «изменилось». другие работы в этом интервале.

В общем, с такой таблицей:

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

Мой желаемый результат будет таким:

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

Я на правильном пути с моим запросом? Или я не в порядке?

Edit:

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)
;

Итак, я использовал объединение вместо того, чтобы извлекать из одной и той же таблицы дважды, потому что мне нужно добавить кучу «фильтров», таких как уровень, предпочтительный_работник, источник. Я думаю, что это замедляет запрос. Но в то же время я чувствую, что интервал времени тоже не дает мне правильных чисел. На данный момент подзапрос группируется по DATE окнам, но количество активных работников составляет как 1, 2, 3 в день, что кажется очень низким.

1 Ответ

0 голосов
/ 31 января 2012

Не совсем уверен, что я точно понимаю ваш вопрос, но я верю, что вы хотите что-то подобное. ctime и mtime содержат дату и время? Если нет, вам нужно заменить их в приведенном ниже 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...