postgresql 选择最有代表性的值

postgresql selecting the most representative value

我有一个 table,其中对象有 ID 和名称。根据定义,id 是正确的,名称几乎总是正确的,但有时传入的脏数据会导致名称为空甚至错误。

所以我做了这样的查询

SELECT id, name, AGGR1(a) as a, AGGR2(b) as b, AGGR3(c) as c
FROM my_table
WHERE d = 3
GROUP BY id

我希望结果中有 name,但上面的当然是错误的。我必须在 id, name 上进行分组,在这种情况下,本应是一行的内容有时会变得不止一行——例如,id 2 的名称为 'John'(正确)、'Jon'(不正确) , 但只有 1%), 或 NULL (也是一小部分).

在 postgresql 中是否有一个构造或惯用语让我 select 一个人在看列表时会说什么显然是共识名称?

(我听说我们的 postgres 安装终于要升级了,如果这很重要的话。)

示例输出,以防散文不清楚

SELECT id, name, COUNT(id) as c
FROM my_table
WHERE d = 3
GROUP BY id

id    name       c

2     John    2000
2     Jon        3
2     (NULL)     5

id    name       c

2     John    2008

您可以通过

获取名字
WITH names as (
  SELECT 
    id, 
    name, 
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY COUNT(1) DESC) as rn
  FROM my_table
  GROUP BY id, name
)
SELECT id, name
FROM names
WHERE rn=1;

然后仅通过 id 进行计算,加入此查询中的名称。