2013-07-06 5 views
18

私のクエリに基づいて、重複値を排除しますか?私はdate列に基づいて更新されたものだけを残したいと思います。は、テーブルの1列のみ

上記の出力例では、私は行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の値を選択すると、グループごとに1つの行のみが選択され、最も大きな日付を持つ行になります。 –

7

あなたの例から、それはへの合理的なようですsiteIP列がsiteName列によって決定されているとします(つまり、各サイトにはsiteIPが1つしかありません)。私の仮定は(つまり、サイトは複数のsiteIPを持ってすることが可能である、である)、それは正しくない場合

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; 

、しかし:これは確かにそうであるならば、group byを使用して、簡単な解決策はあり2番目の列にクエリを返すことを質問する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; 
関連する問題