如何限制Postgres sql中的重复行

如何限制Postgres sql中的重复行,sql,postgresql,Sql,Postgresql,嗨,我有类似于表的数据:水果表 产品代码 产品 日期 镁 芒果 2020-01-25 镁 芒果 2020-01-26 镁 芒果 2020-01-27 镁 芒果 2020-01-28 BN 香蕉 2019-01-15 BN 香蕉 2020-01-19 BN 香蕉 2020-01-20 BN 香蕉 2016-01-20 美联社 苹果 2021-03-02 您可以使用来实现以下目标: SELECT * FROM ( SELECT *, row_numbe

嗨,我有类似于表的数据:水果表

产品代码 产品 日期 镁 芒果 2020-01-25 镁 芒果 2020-01-26 镁 芒果 2020-01-27 镁 芒果 2020-01-28 BN 香蕉 2019-01-15 BN 香蕉 2020-01-19 BN 香蕉 2020-01-20 BN 香蕉 2016-01-20 美联社 苹果 2021-03-02 您可以使用来实现以下目标:

SELECT
    *
FROM (
    SELECT
        *,
        row_number() OVER (PARTITION BY "Product Code" ORDER BY "Date" DESC)     -- 1
   FROM fruit_table
) s
WHERE row_number <= 2                                                            -- 2
row\ U number将行计数添加到有序组=分区中的每个记录中。在您的情况下,组是产品代码或产品,您需要按日期描述订购每个组,以便将最新日期排在顶部。现在,每组中最近的日期得到行数1,最近的第二个日期得到行数2,依此类推 使用此行计数,您只能筛选每个组的两个顶部记录。
请注意:如果您有一个单独的产品表,那么您可能会发现横向连接更快:

select ft.*
from products cross join lateral
     (select ft.*
      from fruit_table ft
      where ft.product = p.product
      order by ft.date desc
      limit 2
     ) ft;

与使用行号的解决方案一样,这将利用fruit_tableproduct、date上的索引。但是,我认为性能通常会稍微好一点,因为在筛选出所有行之前,它不会将行号值分配给所有行。

感谢您的接受。如果您还没有投票,我将不胜感激: