分组多列时如何选择最大值或最后一条记录? [复制]
Posted
技术标签:
【中文标题】分组多列时如何选择最大值或最后一条记录? [复制]【英文标题】:How to Select max value or last record when grouping multiple columns? [duplicate] 【发布时间】:2017-07-31 21:57:19 【问题描述】:这是我想了好几个小时但仍然无法得到答案的事情。
假设我有这张桌子:table
+---------------------------------------------+
+ date | id | Country | Impressions +
+---------------------------------------------+
+ 2017-03-08 | 1 | US | 374 +
+ 2017-03-09 | 1 | US | 521 +
+ 2017-03-10 | 1 | US | 708 +
+ 2017-03-08 | 2 | US | 100 +
+ 2017-03-09 | 2 | US | 200 +
+---------------------------------------------+
我想按 id 和国家/地区对结果进行分组,但要获取最后一天的展示次数(日期或最后一条记录的最大值)
我有这个问题
SELECT * from table group by id,country
但它给了我这个输出
+---------------------------------------------+
+ date | id | Country | Impressions +
+---------------------------------------------+
+ 2017-03-08 | 1 | US | 374 +
+ 2017-03-08 | 2 | US | 100 +
+---------------------------------------------+
如您所见,日期是第一条记录。
我想要一个能给出这个输出的查询
+---------------------------------------------+
+ date | id | Country | Impressions +
+---------------------------------------------+
+ 2017-03-10 | 1 | US | 708 +
+ 2017-03-09 | 2 | US | 200 +
+---------------------------------------------+
如您所见,输出在日期或最后插入的记录中具有最大值
我希望你们能在这方面帮助我,过去几个小时我一直在燃烧我的头,但未能完成。
非常感谢您。
【问题讨论】:
您可以为日期添加 where 条件,不是吗? 我不能,因为日期并不总是相同,有时组和国家/地区的最大日期会不同 【参考方案1】:获取每个 id,country 的最大日期,并将此结果与原始表连接。
SELECT t.*
from table t
join (select id,country,max(date) as maxdate from table
group by id,country) t1
on t1.id=t.id and t1.country=t.country and t1.maxdate=t.date
【讨论】:
【参考方案2】:问题在于您正在考虑“分组”而不是“过滤”。你不想聚合任何列,所以你真的想过滤行。
这是一种过滤方法:
select t.*
from t
where t.date = (select max(t2.date)
from t t2
where t2.country = t.country and t2.id = t.id
);
【讨论】:
以上是关于分组多列时如何选择最大值或最后一条记录? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?