分组多列时如何选择最大值或最后一条记录? [复制]

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
               );

【讨论】:

以上是关于分组多列时如何选择最大值或最后一条记录? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从 Postgres 记录中的行中获取最大值并按多列分组

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

oracle分组后的整条记录怎么取

如何获取最后一条记录/最大值

如何显示mysql分组中时间最大的一行记录