如何修复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
的顺序没有定义,请参见修改后的答案。