如何修复PostgreSQL中错误的最重复值
我有一个查询,它从我的_表中选择重复性最大的值。查询如下:如何修复PostgreSQL中错误的最重复值,sql,postgresql,Sql,Postgresql,我有一个查询,它从我的_表中选择重复性最大的值。查询如下: SELECT gid, max_height FROM ( SELECT gid, max_height, ROW_NUMBER() OVER (PARTITION BY gid ORDER BY freq DESC) AS rn FROM ( SELECT gid, max_height, COUNT(id) AS freq FROM my
SELECT
gid,
max_height
FROM
(
SELECT gid, max_height,
ROW_NUMBER() OVER (PARTITION BY gid ORDER BY freq DESC) AS rn
FROM (
SELECT gid, max_height, COUNT(id) AS freq
FROM my_table
GROUP BY 1, 2
order by 1,2
) hgt_freq
) ranked_hgt_req
WHERE rn = 1
而my_表包含以下三列:
gid id max_height
3 1 19.3
3 2 19.3
3 3 20.3
3 4 20.3
3 5 19.3
3 6 19.3
3 7 21.4
3 8 21.4
3 9 21.4
3 10 21.4
3 11 21.4
3 12 21.4
22 1 23.1
22 2 23.1
22 3 23.1
22 4 23.1
22 5 23.1
22 6 23.1
22 7 22.1
22 8 22.1
22 9 22.1
22 10 22.1
22 11 22.1
22 12 22.1
29 1 24
29 2 24
29 3 24
29 4 18.9
29 5 18.9
29 6 18.9
29 7 NULL
29 8 NULL
29 9 27.1
29 10 27.1
29 11 6.5
29 12 6.5
此查询的问题是,它以降序返回重复性最大的值,这对于gid=22的情况给出了错误的值。查询的输出为:
gid max_height
3 21.4
22 22.1
29 24.0
对于gid=22的情况,有两个最重复的值,即23.1和22.1。因此,查询应该返回23.1。有没有人能告诉我如何解决这个问题,或者有没有更好的方法来解决这个问题?对于大型记录(GID),该过程需要自动化。使用
上的distinct:
select distinct on(gid) gid, max_height
from (
select gid, max_height, count(id) as freq
from my_table
group by 1, 2
) s
order by gid, freq desc
gid | max_height
-----+------------
3 | 21.4
22 | 23.1
29 | 24
(3 rows)
从
SELECT DISTINCT ON(表达式[,…])仅保留给定表达式计算结果相等的每组行的第一行。DISTINCT ON表达式使用与ORDER BY相同的规则进行解释(见上文)。请注意,每个集合的“第一行”是不可预测的,除非使用ORDER BY来确保所需的行首先出现
gid=29有两个最常见的值。在这种情况下,您可以通过在
order by
中添加一个以上条件来选择它们的显示顺序:
select distinct on(gid) gid, max_height
from (
select gid, max_height, count(id) as freq
from my_table
group by 1, 2
) s
order by gid, freq desc, max_height desc;
gid | max_height
-----+------------
3 | 21.4
22 | 23.1
29 | 24
(3 rows)
select distinct on(gid) gid, max_height
from (
select gid, max_height, count(id) as freq
from my_table
group by 1, 2
) s
order by gid, freq desc, max_height;
gid | max_height
-----+------------
3 | 21.4
22 | 22.1
29 | 18.9
(3 rows)
在上使用不同的
:
select distinct on(gid) gid, max_height
from (
select gid, max_height, count(id) as freq
from my_table
group by 1, 2
) s
order by gid, freq desc
gid | max_height
-----+------------
3 | 21.4
22 | 23.1
29 | 24
(3 rows)
从
SELECT DISTINCT ON(表达式[,…])仅保留给定表达式计算结果相等的每组行的第一行。DISTINCT ON表达式使用与ORDER BY相同的规则进行解释(见上文)。请注意,每个集合的“第一行”是不可预测的,除非使用ORDER BY来确保所需的行首先出现
gid=29有两个最常见的值。在这种情况下,您可以通过在
order by
中添加一个以上条件来选择它们的显示顺序:
select distinct on(gid) gid, max_height
from (
select gid, max_height, count(id) as freq
from my_table
group by 1, 2
) s
order by gid, freq desc, max_height desc;
gid | max_height
-----+------------
3 | 21.4
22 | 23.1
29 | 24
(3 rows)
select distinct on(gid) gid, max_height
from (
select gid, max_height, count(id) as freq
from my_table
group by 1, 2
) s
order by gid, freq desc, max_height;
gid | max_height
-----+------------
3 | 21.4
22 | 22.1
29 | 18.9
(3 rows)
我想知道在你的情况下,gid=29是如何返回24的。对我来说,它返回了18.9。我在gid 3,22,29中得到了最大高度21.4,23.1,18.9。我很困惑。知道为什么吗?这是因为
max_height
的顺序未定义,请参见修改后的答案。我想知道在您的情况下,gid=29时它如何返回24。对我来说,它返回了18.9。我在gid 3,22,29中得到了最大高度21.4,23.1,18.9。我很困惑。知道为什么吗?这是因为max_height
的顺序没有定义,请参见修改后的答案。