仅基于表的一列消除重复值

Ned*_*Ned 27 sql sql-server inner-join distinct duplicate-removal

我的查询:

SELECT sites.siteName, sites.siteIP, history.date
FROM sites INNER JOIN
     history ON sites.siteName = history.siteName
ORDER BY siteName,date
Run Code Online (Sandbox Code Playgroud)

输出的第一部分:

在此输入图像描述

如何删除siteName列中的重复项?我想只留下基于date列的更新版本.

在上面的示例输出中,我需要行1,3,6,10

Gor*_*off 29

这是窗口函数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
Run Code Online (Sandbox Code Playgroud)

  • @ JacksOnF1re...你知道`row_number()`的作用吗?它枚举组中的行(由`partition by`子句定义).排序基于`order by`子句.通过选择值1,每组只选择一行,这将是具有最大日期的行. (6认同)
  • 你能解释一下这个问题吗? (5认同)
  • 哇,戈登花了2分钟才想到这个。嗯 (3认同)

Mik*_*rov 8

从您的示例中可以合理地假设该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;
Run Code Online (Sandbox Code Playgroud)

但是,如果我的假设不正确(也就是说,站点可能有多个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;
Run Code Online (Sandbox Code Playgroud)