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
。
我需要从 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
。