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
进行计算,加入此查询中的名称。
我有一个 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
进行计算,加入此查询中的名称。