我的疑问:
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行
4条答案
按热度按时间fae0ux8s1#
这就是窗口函数
row_number()
派上用场的地方:c3frrgcw2#
从您的示例中可以合理地假设
siteIP
列由siteName
列确定(即每个站点只有一个siteIP
)。如果确实如此,则有一个使用group by
的简单解决方案:但是,如果我的假设不正确(也就是说,一个站点可能有多个
siteIP
),那么从您的问题中就不清楚您希望查询在第二列中返回哪个siteIP
。kcugc4gi3#
我使用以下模式解决此类查询:
也就是说,它将选择字段值为最大值的记录。为了将它应用于您的查询,我使用了公共表表达式,这样我就不必重复JOIN两次:
需要注意的是,只有在计算最大值的字段是唯一的情况下,它才有效,在示例中,
date
字段对于每个siteName
都应该是唯一的。也就是说,如果IP不能在每毫秒内多次更改。根据我的经验,这是常见的情况,否则你不知道哪个记录是最新的。如果history
表具有(site, date)
的唯一索引,则该查询也非常快,可以使用history
表上的索引范围扫描,该索引范围扫描仅扫描第一项。kxe2p93d4#
这是可以删除重复列值的最简单SQL
table
是表的名称,column_name
是不希望重复的列的名称。