MYSQL self join get row based on MAX 并且具有

MYSQL self join get row based on MAX and having

我需要从 2 table 开始计算行数,如果 events.event_id IN (30, 31, 32, 33) 则只获取最高 g_event_id 的行。仅考虑 events.event_id 为 30-33 的行。

SQL Fiddle: Fiddle

我的tables:

 CREATE TABLE event_parties
 (`g_event_id` int, `agent_id` int)
;

INSERT INTO event_parties
(`g_event_id`, `agent_id`)
VALUES
(2917, '2'),
(2918, '2'),
(2919, '2'),
(3067, '3'),
(3078, '3'),
(3079, '1'),
(3082, '1'),
(3917, '2'),
(3918, '2'),
(3919, '2'),
(4067, '3'),
(4078, '3'),
(4079, '1'),
(5067, '3'),
(5078, '3'),
(5079, '1'),
(6067, '3'),
(6078, '3'),
(6079, '1'),
(7067, '3'),
(7078, '3'),
(7079, '1'),
(8067, '3'),
(8078, '3'),
(8079, '1')

;
CREATE TABLE events
(`g_event_id` int, `event_id` int, `event_time` datetime)
;

INSERT INTO events
(`g_event_id`, `event_id`, `event_time`)
 VALUES
(2917, '29', '2016-10-19 15:24:25'),
(2918, '31', '2016-10-19 15:24:28'),
(2919, '21', '2016-10-19 15:29:46'),
(3067, '29', '2016-10-20 15:33:46'),
(3078, '23', '2016-10-21 15:29:46'),
(3079, '29', '2016-10-20 15:34:46'),
(3082, '30', '2016-10-21 15:42:46'),
(3917, '29', '2016-10-19 15:24:25'),
(3918, '31', '2016-10-19 15:24:28'),
(3919, '21', '2016-10-19 15:29:46'),
(4067, '29', '2016-10-20 15:33:46'),
(4078, '23', '2016-10-21 15:29:46'),
(4079, '29', '2016-10-20 15:34:46'),
(5067, '29', '2016-10-20 15:33:46'),
(5078, '23', '2016-10-21 15:29:46'),
(5079, '29', '2016-10-20 15:34:46'),
(6067, '29', '2016-10-20 15:33:46'),
(6078, '23', '2016-10-21 15:29:46'),
(6079, '29', '2016-10-20 15:34:46'),
(7067, '29', '2016-10-20 15:33:46'),
(7078, '23', '2016-10-21 15:29:46'),
(7079, '29', '2016-10-20 15:34:46'),
(8067, '29', '2016-10-20 15:33:46'),
(8078, '23', '2016-10-21 15:29:46'),
(8079, '29', '2016-10-20 15:34:46')

;

select 应该给我呼叫中心代理的状态,我想计算每个状态 (event_id) 中有多少代理 (agent_id)。由于 table "events" 只是代理的事件,我只需要计算每个 agent_id 的最新(具有最高值)g_event_id 和棘手的部分是我只想要计算 event_id IN (30, 31, 32, 32, 33) 的位置。 所以基本上,每个 agent_id 具有最高 g_event_id(和 event_id IN (30, 31, 32, 33))的 select 行。 我需要在这两个 table 之间建立一个 JOIN,ID 为 g_event_id。字段 g_event_id 是键,只出现一次。我需要 table events 中的所有字段,并且我需要具有最高 g_event_id 或最高 event_time 的行。 像这样:

event_id   N_events
--------   ----------
    31         1
    30         1

到目前为止我有这个select:

SELECT event_id,
COUNT(events.event_id) AS N_events
FROM event_parties 
INNER JOIN events USING (g_event_id)
LEFT JOIN event_parties AS later_event
ON (later_event.agent_id = event_parties.agent_id 
  AND later_event.g_event_id > event_parties.g_event_id)
WHERE later_event.g_event_id IS NULL AND event_parties.agent_id != 0 AND     events.`event_id` IN (30,31,32,33)
GROUP BY events.event_id

上面这个 select 的问题是它只会给我最高 g_event_id 的行,我只想 select 具有 events.event_id = (30 , 31, 32, 33) 然后计算最高 g_event_id

的行数

一直在尝试在 GROUP (HAVING events.event_id IN (30,31,32,33)) 之后使用 having,但没有成功。

这个查询应该给你你的结果:

select e.event_id, count(stats.agent_id) as N_count
from (
  select max(p.g_event_id) as g_event_id, p.agent_id
  from events e 
  join event_parties p
  on e.g_event_id = p.g_event_id
  where e.event_id in (30,31,32,33)
  group by p.agent_id
) as stats
join events e
on e.g_event_id = stats.g_event_id
group by e.event_id;

内部查询(stats)首先检索每个代理的最新相关状态:它将为每个agent_id获取最大的g_event_id,其中一个event_id给定范围(因此每个代理最多一行)。

然后它将与 events-table 结合以检索此 g_event_id 的实际 event_id;然后计算每个 event_id.

的代理数量

如评论中所述,这假设 g_event_id 是两个 table 的主键(但特别是 events),并且给出了最新状态最大的 g_event_id,而不是 event_time