我有一个表,其中的对象有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中是否有一种结构或习语可以让我选择一个人在看列表时会说的显然是共识名称?
(我听说我们的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
进行计算,将此查询中的名称连接起来。