在更宽的查询中返回单个字段分组的最小值

时间:2015-03-11 14:38:20

标签: mysql sql

这是一个查询:

select
    e.eid,
    e.event_time as contact_created,
    cs.name as initial_class,
    cn.create_time as lead_date
from bm_sets.event378 e
inner join bm_config.classes cs on cs.id = e.class_id and cs.cid=378 # and cs.name = 'Candidate'
left join bm_sets.conversion378 cn on cn.eid = e.eid and cn.create_time > e.event_time
where e.eid = 283818 
group by eid, contact_created, initial_class, lead_date

此查询的结果如下所示:

eid,    contact_created, initial_class, lead_date
283818  2015-03-07 09:43:42 Hot 
283818  2015-03-10 22:19:47 Candidate   
283818  2015-03-10 22:22:11 Candidate

我需要调整此查询,以便仅返回第一条记录,即具有最小contact_created日期的记录。但是因为我在其他字段中使用聚合函数,所以我也使用initial_class进行分组,因此min是基于组合分组的min。

每当我使用子查询时,我们的服务器似乎都很挣扎。所以我尝试使用另一个连接作为过滤器,例如:

inner join bm_sets.event378 e1 on e1.eid = e.eid and e1.event_time < e.event_time

但是我知道在运行它之前这不会起作用,因为仍然会返回eid(用户ID)283818,因此还会返回所有相关数据。

如何将结果限制为仅与event_time最小值对应的记录?

我正在使用where条件283818(我自己的用户id进行调试)作为我构造此查询时的健全性检查。准备好后,查询将不具备此条件,因此结果将适用于许多用户。

2 个答案:

答案 0 :(得分:0)

如果您只需要前1名,那么您只需拨打

选择前1名

或者您需要创建一个返回最小created_contact的函数,然后将其与当前created_contact进行比较。

我希望这会对你有所帮助 感谢

答案 1 :(得分:0)

好的,我明白了。我像这样使用了一个null左连接(在groupwise min / max主题的其他SO帖子的背面):

将此添加到选择器:

e1.event_time

将此添加到加入:

left join bm_sets.event378 e1 on e1.eid = e.eid and e1.event_time < e.event_time

将此添加到where子句:

and e1.event_time is null