基于MAX和have的MYSQL自连接get行

基于MAX和have的MYSQL自连接get行,mysql,sql,select,self-join,having,Mysql,Sql,Select,Self Join,Having,我需要对两个表中的行进行计数,如果(30,31,32,33)中的events.event\u id为,则只获取具有最高g\u event\u id的行。仅考虑事件中的行。事件id为30-33 SQL Fiddle: 我的桌子: CREATE TABLE event_parties (`g_event_id` int, `agent_id` int) ; INSERT INTO event_parties (`g_event_id`, `agent_id`) VALUES (2917, '2

我需要对两个表中的行进行计数,如果(30,31,32,33)中的
events.event\u id为,则只获取具有最高
g\u event\u id的行。仅考虑
事件中的行。事件id
为30-33

SQL Fiddle:

我的桌子:

 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给我一个呼叫中心代理的状态,我想计算每个状态(事件id)中有多少代理(代理id)。由于表“events”只是代理的事件,我只需要计算每个代理的最新(具有最高值)g_event_id,棘手的是,我只想计算事件_id所在的位置(30、31、32、32、33)。 因此,基本上,为每个代理选择具有最高g_event_id(以及(30、31、32、33)中的event_id)的行。 我需要在这两个表之间使用
g_event_id
作为id进行连接。字段g_event_id是键,只显示一次。我需要表
events
中的所有字段,我需要具有最高
g\u event\u id
或最高
event\u time
的行。 像这样:

event_id   N_events
--------   ----------
    31         1
    30         1
到目前为止,我有以下选择:

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
上面这个选择的问题是,它只会给我提供具有最高
g\u事件\u id
的行,我只想选择具有
事件的行。事件\u id
=(30、31、32、33),然后计算具有最高
g\u事件\u id


尝试在组后使用
having
having events.event\u id IN(30,31,32,33)
)但未成功。

此查询应给出您的结果:

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\u id
的最大
g\u事件id
,并且
event\u id
在给定范围内(因此每个代理最多一行)

然后,它将与
事件
-表联接,以检索此
g_事件_id
的实际
事件_id
;然后它统计每个
事件\u id
的代理数


如注释中所述,这假设
g_event_id
是两个表的主键(尤其是
events
),并且最新状态由最大的
g_event_id
给出,而不是
event_time
,小提琴对我不起作用,所以我无法检查:
g_event_id
是您的主键吗?我想不会,否则你的计数会是1或0,对吗?此外,您的选择列表(4列)不符合您请求的结果(2列)或您的
分组依据(1列+1计数)。此外,我也不太明白您所说的“我需要具有最高g_事件\u id或具有最高事件\u时间的行”是什么意思-这可能描述了2行,您想要哪一行?那么:你能从这些数据中添加你想要的确切结果吗?以及更清晰的示例数据(例如,超过1个相同的g_事件_id)和表格?更新了Fiddle[link]()。上面也更新了更多数据。假设select给我一个呼叫中心代理的状态,我想计算每个状态(事件id)中有多少代理(代理id)。由于“事件”表只是代理上的事件,我只需要计算每个代理的最相关事件id,棘手的部分是我只想计算事件id在(30、31、32、32、33)中的位置,您仍然没有回答重要的问题:每个
g\u事件id
是否可以超过1行(这就是“更多数据”应该显示的内容),以及您所提供的数据的确切结果集(因为您的描述仍然不够清楚)。抱歉,是的,g_event_id是主键(每个g_event_id只有一行)。我想要的确切结果是:事件我想我还是没有抓住要点。如果
g\u event\u id
是主键,则最多有一行具有最高的
g\u event\u id
。由于您甚至不想在结果中使用该id,您可以使用(g_event_id)在(30,31,32,33)中的events.event_id查询
选择distinct event_id,1作为N_events FROM event_parties内部连接事件。如果事件中的每一行肯定都有参与方中的一行,那么您甚至可以删除
加入