2017-07-28 49 views
0

我有一張表,其中每個ID重複3次。每行的每個ID前面都有一個日期。
我想爲日期最新的每個ID選擇整行。 此表中共有370列,我希望所有列在我選擇該行時被選中。在sql中選擇行,每個ID的最近日期重複多次

樣本 -

ID Name Date  Marks .. .. .. 
1  XY  4/3/2017  27 
1  fv  4/3/2014  98 
1  jk  4/3/2016  09 
2  RF  4/12/2015 87 
2  kk  4/3/2009  56 
2  PP  4/3/2011  76 
3  ee  4/3/2001  12 
3  ppp 4/3/2003  09 
3  lll 4/3/2011  23 

答案應該是

ID Name Date  Marks .. .. .. 
1  XY  4/3/2017  27  
2  RF  4/12/2015 87 
3  lll 4/3/2011  23 

我試圖如下 -

select distinct ID,*,max(date) as maxdate from table 

而且我在蜂房嘗試這個。所以不知道,如果一些SQL函數不要在蜂巢工作

感謝

+0

類似的問題已經回答了這裏 - https://stackoverflow.com/questions/13523049/hive-sql-find-the -latest-record/43528852#43528852 –

回答

1

此問題已詢問。請參閱this問題。

使用公認的答案,並使其適應您的問題,您可以:

SELECT tt.* 
FROM myTable tt 
INNER JOIN 
    (SELECT ID, MAX(Date) AS MaxDateTime 
    FROM myTable 
    GROUP BY ID) groupedtt 
ON tt.ID = groupedtt.ID 
AND tt.Date = groupedtt.MaxDateTime 
+0

看起來像最後一行應該是AND tt.Date = groupedtt.MaxDateTime ....謝謝 – Earthshaker

+0

當然。如果你喜歡這個答案,請註冊並選擇答案。 – ecarlin

2

一種方法是:

select table.* 
from table 
join 
(
    select ID, max(Date) as max_dt 
    from table 
    group by ID 
) t 
on table.ID= t.ID and table.Date = t.max_dt 

請注意,如果您有相同ID的多個同樣較高的日期,那麼你會得到所有這些在結果行

+0

yes ..完全是這樣的'它是如何發生的...然後我想我可以從整個數據庫中刪除重複的行...然後這些多行將消失,併爲每個id在那裏將只有一行。 – Earthshaker

0

你有沒有試過如下:

SELECT ID, COUNT(*), max(date) 
FROM table 
GROUP BY ID; 
+1

這將不會返回該表中具有最大日期的記錄的所有字段。 – JNevill

0

你可以使用相關子查詢(這是一個子查詢,其中您引用主查詢中的一個字段)執行此操作。在這種情況下:

SELECT * 
FROM yourtable t1 
WHERE date = (SELECT max(date) from yourtable WHERE id = t1.id) 

這裏,我們給了yourtablet1一個別名,然後使用該別名的子查詢中從同一個表yourtable抓住max(date)id

0

您可以使用連接做具有與每個ID最近日期此

SELECT t1.* from myTable t1 
LEFT OUTER JOIN myTable t2 on t2.ID=t1.ID AND t2.`Date` > t1.`Date` 
WHERE t2.`Date` IS NULL; 

只有行有NULL加入到t2。

+0

舊學校。尼斯。 – Strawberry

+0

這是給我錯誤,因爲在JOIN'date' – Earthshaker

+0

中遇到左側和右側別名是否是mysql報告的錯誤?我不知道它的問題,但日期是一個儲備詞,所以我用反引號更新了我的答案。 – RichGoldMD

0

這是一種方法。內部查詢獲取每個id的最大日期。然後,您可以將其加入主表以獲取匹配的行。

select 
* 
from 
<your table> 
inner join 
(select id, max(<date col> as max_date) m 
where yourtable.id = m.id 
and yourtable.datecolumn = m.max_date)