web-dev-qa-db-ja.com

テーブルの1列のみに基づいて重複値を削除する

私のクエリ:

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が必要です

25
Ned

これはウィンドウ関数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
27
Gordon Linoff

あなたの例から、siteIP列はsiteName列によって決定されると仮定するのが妥当と思われます(つまり、各サイトにはsiteIPが1つしかありません)。これが本当に当てはまる場合は、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をクエリに返すのかは明確ではありません2列目。いずれかの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;
8
Mikhail Makarov