2017-03-10 155 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 
       ); 
相關問題