【问题标题】:Postgresql 8.3 duplicate rowsPostgresql 8.3重复行
【发布时间】:2013-02-26 22:49:33
【问题描述】:

我正在编写的一个查询有一点问题。在 where 子句中,我有很多连接和提取的很多列,我将日期列与同一个表的最小值进行比较。但是当我得到两行相同的日期时,我只需要得到一行。 where 子句是这样的:

bt.da2 = (select min(btreg.da2) from bt btreg.....

查询结果很多客户,每个客户都有那个bt.da2日期。我需要当一个客户有两行,具有相同的 bt.da2 值时,我需要只取两行中的一个,而不是两行。 我可能解释不清楚。请如果有人知道我在问什么,有什么不清楚的地方,请问我。

我正在使用PostgreSQL 8.3

问候, 朱利安

【问题讨论】:

  • 您需要提供更多详细信息:您正在使用的完整语句以及可能涉及的表的create table 语句。理想情况下是一个显示您当前问题的 SQLFiddle 示例
  • 我很乐意给你看,没有问题,但它涉及32个表,我不能给你看所有的create table语句。基本上有一个产品表、一个客户表、一个付款表和银行转帐表(示例中的 bt 表)。我只是拿产品表,左加入银行转帐表,因为有些客户在同一日期有不止一个银行转帐,这就是为什么它显示两行或更多行,这是我想避免的事情。有没有办法“说”:如果有两个相同日期的转帐,只需返回其中一个,与谁无关。
  • 您的表是否至少有一个唯一键列(或列的组合)注意:您至少应该将其中一个表的定义添加到问题中。注2:升级。

标签: sql postgresql


【解决方案1】:

用这么少的信息很难说,但我会尝试这样的事情:

select *
from (
  select product_id, -- assumed to be the primary key 
         ...
         row_number() over (partition by product_id order by bt.da2) as rn
  from products pr
    left join bt on bt.da2 = pr.some_col
) t
where rn = 1

row_number() 函数用于为每个产品创建连续编号。然后外部where 子句选择第一个子句。您可以更改窗口定义中的order by 以影响您选择的那个。

【讨论】:

  • 感谢解答,但是Postgresql 8.4 不支持row_number() 函数:(
  • @dna:是的。 8.4 是第一个引入此功能的版本。
  • 我的错,服务器版本是8.3.13 :(
  • @dna:那你应该尽快更新。 8.3 不再受支持(而且和 8.4 一样已经很老了)
  • 谢谢,但这是我的老板做出的决定,我在那边没有权力,我正在寻找解决方案,扭曲和 sh*t 以获得他们想要的结果: ) ... 8.3.13
【解决方案2】:

您应该能够使用以下方法整理出 da2 的重复值:

bt.da2 = (select distinct min(btreg.da2) from bt btreg.....

我使用 PostgreSQL 9.1 进行了尝试,但我确信 distinct 关键字在 8.4 中也能按预期工作。

【讨论】:

  • 条件的结构方式,子选择必须只返回一行,所以 distinct 不会产生影响。
  • min() 函数只返回一个日期。问题是,当它开始将此日期与外部 bt 表进行比较时,我有两行用于与子查询返回的日期相同的客户
猜你喜欢
  • 2018-11-24
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 2020-02-23
相关资源
最近更新 更多