【问题标题】:Removing duplicate values from a column in SQL从 SQL 中的列中删除重复值
【发布时间】:2020-01-23 01:12:09
【问题描述】:

我有两张桌子 A (group_id, id, subject) 和 B (id, date)。下面是表A和B在id上的联表。我曾尝试使用 distinct 和 partition 仅删除 group_id(field) 中的重复项,但没有运气:

我的代码:

select 
    a.group_id, a.id, a.subject, b.date 
from
    A a 
inner join
    (select 
         b.*, 
         row_number() over (partition by group_id order by date asc) as seqnum
     from 
         B b) b on a.id = b.id and seqnum = 1
order by
    date desc; 

我在运行代码时遇到了这个错误:

在第 1 行的 'partition by group_id order by date asc) as seqnum from B' 附近的查询中不能单独使用分区

这是我的预期结果:

提前感谢您!

【问题讨论】:

  • 你在问题​​中提到了两张表,但只显示一张。
  • 用您正在使用的数据库标记您的问题。

标签: sql database partition


【解决方案1】:

您似乎希望显示表格中每一行的最早日期。您的问题提到了两张表,但您只显示了一张。

我建议在大多数数据库中使用相关子查询:

select b.*
from b
where b.date = (select min(b2.date)
                from b b2
                where b2.group_id = b.group_id
               );

我明白了。你需要先join再使用row_number()

select ab.*
from (select a.group_id, a.id, a.subject, b.date,
             row_number() over (partition by a.group_id order by b.date) as seqnum
      from A a join
           B b
           on a.id = b.id
     ) ab
where seqnum = 1
order by date desc; 

【讨论】:

  • 感谢您的及时回复!不幸的是,仍然遇到同样的错误。
【解决方案2】:

你快到了。但是您尝试用于分区的列(即group_id)来自表a,该表在子查询中不可用。

您需要JOIN 并在子查询中分配行号,然后然后 在外部查询中进行过滤。

select * 
from (
    select 
        a.group_id, 
        a.id, 
        a.subject, 
        b.date,
        row_number() over (partition by a.group_id order by b.date asc) as seqnum
    from a
    inner join b on ON a.id = b.id 
)
where seqnum = 1
ORDER BY date desc; 

【讨论】:

  • 感谢您的及时回复!不幸的是,仍然遇到同样的错误。
  • @Fun-zin:请告诉我您使用的是哪个 RDBMS(和版本)...
【解决方案3】:

实现目标的另一种方法,尽管它可能不是有效的方法

SELECT
  A.group_id, A.id, B.Date, A.subject
FROM A
INNER JOIN B
ON A.Id = B.Id
INNER JOIN
(
  SELECT
    A.Group_id, MIN(B.Date) AS Date
  FROM A
  INNER JOIN B
  ON A.Id = B.Id
  GROUP BY A.group_id
) AS supportTable
ON A.group_id = supportTable.group_id
AND B.Date = supportTable.Date

【讨论】:

    猜你喜欢
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多