私のクエリ:
SELECT sites.siteName, sites.siteIP, history.date
FROM sites INNER JOIN
history ON sites.siteName = history.siteName
ORDER BY siteName,date
出力の最初の部分:
siteName
列の重複を削除するにはどうすればよいですか? date
列に基づいて更新されたもののみを残します。
上記の出力例では、行1、3、6、10が必要です
これはウィンドウ関数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
あなたの例から、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;