如何在一个值的数量大于另一个值的 postgresql 行中进行选择? [关闭]

Posted

技术标签:

【中文标题】如何在一个值的数量大于另一个值的 postgresql 行中进行选择? [关闭]【英文标题】:How to choose in postgresql rows where amount of one value is bigger than another? [closed] 【发布时间】:2021-03-18 06:30:39 【问题描述】:

如何在一个值的数量大于另一个值的 postgresql 行中进行选择? 例如,我只需要选择推荐较大的那些:

换句话说:

create table t(id bigint, place text, opinion text);
insert into t values
    (1, 'mnt', 'yes'),
    (2, 'mnt', 'no'),
    (3, 'mnt', 'no'),
    (4, 'cod', 'yes'),
    (5, 'cod', 'yes'),
    (6, 'cod', 'yes'),
    (7, 'qrw', 'yes'),
    (8, 'qrw', 'no'),
    (9, 'caf', 'no'),
    (10, 'mnt', 'yes');

我试图按地点统计分组,意见

【问题讨论】:

你想要什么结果?你在说什么? @GordonLinoff 我想获得那些推荐大于“不推荐”的行 什么是“更大”?你是说你想要“推荐”或“不推荐”还是更高的 id?还有什么? 【参考方案1】:

我认为您希望地点的“推荐”意见多于“不推荐”意见。如果是这样,您可以使用带有having 子句的聚合和过滤器:

select place
from mytable
group by place
having count(*) filter(where opinion = 'recommended') 
     > count(*) filter(where opinion = 'not recommended')

如果你想要这些行的详细信息,你可以使用窗口函数:

select *
from (
    select t.*,
        count(*) filter(where opinion = 'recommended'    ) over(partition by place) as cnt_recommended,
        count(*) filter(where opinion = 'not recommended') over(partition by place) as cnt_not_recommended
    from mytable t
) t
where cnt_recommended > cnt_not_recommended

【讨论】:

谢谢,正是我需要的 @ДенисИванов:欢迎。我应该强调 Gordon Linoff 的答案与我的几乎相同,并在几秒钟前发布。【参考方案2】:

另一个 GROUP BY/HAVING 替代方案。

select place
from tablename
group by place
having sum(case when opinion = 'recommended' then 1
                when opinion = 'not recommended' then -1
           end) > 0

编辑: @Abelisto 建议这样做,从推荐到不推荐排序:

select place
from tablename
group by place
order by sum(case when opinion = 'recommended' then 1
                  when opinion = 'not recommended' then -1
             end) desc

编辑 2

select
    place,
    sum(
        case
            when opinion = 'recommended' then 1
            when opinion = 'not recommended' then -1
            else 0
        end) as rate
from tablename
group by place
order by rate desc

【讨论】:

+1 BTW order by desc 而不是 having 对于专家来说可能更有趣。就像“最有效的……仍然有效,但不是那么好……平均……几乎无法使用……” @Abelisto,好主意,已编辑。【参考方案3】:

如果你正在寻找推荐大于不推荐的地方,你可以使用聚合:

select place
from t
group by place
having count(*) filter (where opinion = 'recommended') > count(*) filter (where opinion = 'not recommended');

您也可以更简单地表达为:

select place
from t
where opinion in ('recommended', 'not recommended')
group by place
having avg( (opinion = 'recommended)::int ) > 0.5;

【讨论】:

以上是关于如何在一个值的数量大于另一个值的 postgresql 行中进行选择? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何找到具有一定数量大于阈值的值的窗口的索引?

Hive Bucketing:不同列值的数量大于分桶数量

如何获得关注者数量大于值的推特关注者列表?

如何使用熊猫从另一个数据框 B 的列中删除包含特定数量值的数据框 A 中的行?

有序 postgresql 数组中大于 x 的最小值的位置(优化)

如何在 postgres 中创建表并插入具有动态值的数据