PostgreSQL:如何将大写/小写视为重复项,而不是更改大小写并保留较早的条目?

Posted

技术标签:

【中文标题】PostgreSQL:如何将大写/小写视为重复项,而不是更改大小写并保留较早的条目?【英文标题】:PostgreSQL: How to treat upper/lower case as duplicates, not change case and keep earlier entry? 【发布时间】:2021-09-09 05:28:31 【问题描述】:

在下文中,'abc' 和 'ABC' 应被视为重复项。但我想保留原来的外壳,我想采用较早日期的条目。所以我最终得到:abc, 2021-06-01

我认为这会起作用,但它没有:

select t.s, max(t.d) from 
(
   select 'abc' s, '2021-06-01'::date d union all
   select 'ABC' s, '2021-06-21'::date d 
) t
group by lower(t.s)

抛出此错误:Invalid operation: column "t.s" must appear in the GROUP BY clause or be used in an aggregate function;

我在这里错过了什么?

谢谢!

【问题讨论】:

【参考方案1】:

您可以使用 PostgreSQL 特定的 DISTINCT ON 构造。

select distinct on (lower(t.s)) t.s, t.d from 
(
   select 'abc' s, '2021-06-01'::date d union all
   select 'ABC' s, '2021-06-21'::date d 
) t
order by lower(t.s), d asc;

如果您想要更标准的 SQL,可以使用窗口函数添加行号,然后过滤该行号:

select * from (
   select *, row_number() over (partition by lower(t.s) order by t.d) from  
   (
      select 'abc' s, '2021-06-01'::date d union all
      select 'ABC' s, '2021-06-21'::date d 
   ) t
) t2 where row_number =1;

【讨论】:

以上是关于PostgreSQL:如何将大写/小写视为重复项,而不是更改大小写并保留较早的条目?的主要内容,如果未能解决你的问题,请参考以下文章