2017-03-10 43 views
1

这是我一直在想几个小时,仍然不能得到答案。如何在分组多列时选择最大值或最后一条记录?

假设我有这个表:表

+---------------------------------------------+ 
+  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  + 
+---------------------------------------------+ 

正如你可以看到输出对日期的最大值,或最后一个记录插入

我希望你们能帮助我在这,我在最后几个小时一直在烧我的头,并没有完成这个任务。

非常感谢您提前。

+0

您可以添加一个WHERE条件的日期,不是吗? – Krishnakumar

+0

我不能,因为日期并不总是相同的,有时最高日期会因组和国家而不同 – Lucas

回答

2

获取每个国家/地区的最大日期,并将该结果与原始表结合起来。

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 
1

问题是,你在考虑“组”而不是“过滤器”。你不想聚合任何列,所以你真的想过滤行。

下面是过滤的一种方法:

select t.* 
from t 
where t.date = (select max(t2.date) 
       from t t2 
       where t2.country = t.country and t2.id = t.id 
       ); 
相关问题