我的查詢:消除重複值
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
我的查詢:消除重複值
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
)。如果事實確實如此,那麼有使用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;
你能解釋一下這個查詢嗎? – JacksOnF1re
@ JacksOnF1re。 。 。你知道'row_number()'做什麼嗎?它枚舉組中的行(由'partition by'子句定義)。排序基於'order by'子句。通過選擇1的值,每組只選擇一行,並且這將是具有最大日期的那一行。 –