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