2013-07-06 104 views
18

我的查詢:消除重複值

SELECT sites.siteName, sites.siteIP, history.date 
FROM sites INNER JOIN 
    history ON sites.siteName = history.siteName 
ORDER BY siteName,date 

輸出的第一部分:

enter image description here

我怎樣才能刪除重複的siteName列?我想只留下基於date列的更新版本。

在上面的示例輸出,我需要的行1,3,6,10

回答

20

這是窗口函數row_number()就派上用場了:

SELECT s.siteName, s.siteIP, h.date 
FROM sites s INNER JOIN 
    (select h.*, row_number() over (partition by siteName order by date desc) as seqnum 
     from history h 
    ) h 
    ON s.siteName = h.siteName and seqnum = 1 
ORDER BY s.siteName, h.date 
+3

你能解釋一下這個查詢嗎? – JacksOnF1re

+5

@ JacksOnF1re。 。 。你知道'row_number()'做什麼嗎?它枚舉組中的行(由'partition by'子句定義)。排序基於'order by'子句。通過選擇1的值,每組只選擇一行,並且這將是具有最大日期的那一行。 –

7

從你的例子似乎是合理的假設siteIP列由siteName列確定(即每個站點只有一個siteIP)。如果事實確實如此,那麼有使用group by一個簡單的解決方案:

select 
    sites.siteName, 
    sites.siteIP, 
    max(history.date) 
from sites 
inner join history on 
    sites.siteName=history.siteName 
group by 
    sites.siteName, 
    sites.siteIP 
order by 
    sites.siteName; 

但是,如果我的假設是不正確的(即,它是可能的站點有多個siteIP),那麼它是不清楚你的問題哪個siteIP你希望查詢在第二列中返回。如果只是任何siteIP,那麼下面的查詢將做:

select 
    sites.siteName, 
    min(sites.siteIP), 
    max(history.date) 
from sites 
inner join history on 
    sites.siteName=history.siteName 
group by 
    sites.siteName 
order by 
    sites.siteName;