sql - 列属性的条件组

标签 sql postgresql

我有一个包含这些列的表:pkgenderattribute,我想为每个性别选择前 10 个属性。目前我使用两个查询来完成:

SELECT attribute, count(attribute)
FROM tab
WHERE gender=1
GROUP BY attribute
ORDER BY count(attribute) DESC
LIMIT 10

和另一个查询 WHERE gender=0

我可以对一个查询进行此操作,并输出每个性别的前 10 个属性吗

男性属性,计数,女性属性,计数

最佳答案

可以。最简单的方法是使用变量:

SELECT gender, attribute, cnt
FROM (SELECT ag.*,
             (@rn := if(@g = gender, @rn + 1,
                        if(@g := gender, 1, 1)
                       )
             ) as seqnum
      FROM (SELECT gender, attribute, count(attribute) as cnt
            FROM tab
            GROUP BY gender, attribute
            ORDER BY gender, cnt DESC
           ) ag CROSS JOIN
           (SELECT @rn := 0, @g := -1) params
     ) ag
WHERE seqnum <= 10;

有了两个性别值,单独的查询可能会更简单。但是,如果您有更多的值(value),那么这种方法也有它的优点。

编辑:

Postgres 中的解决方案要简单得多:

select gender, attribute, cnt
from (select gender, attribute, count(*) as cnt,
             row_number() over (partition by gender order by count(*) desc) as seqnum
      from tab t
      group by gender, attribute
     ) ga
where seqnum <= 10;

关于sql - 列属性的条件组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37817155/

相关文章:

sql - 使用 SQL 获取和删除查询字符串

mysql - 如何使用 sql 查询加入我的发票和发票产品表..?

sql - Rails 有 activerecord 一次性获取所有需要的关联吗?

postgresql - py.test 混合装置和 asyncio 协程

sql - 如何隐藏没有记录的子报表

sql - BigQuery 中的查询命中和自定义维度?

c - C 错误 : is only a shell 中的 PostgreSQL 用户数据类型

SQL - 根据条件将某些列设置为空

node.js - 在 NodeJS 中测试数据库相关代码

php - 如何在我的mysql数据库中获取planet-latest.osm.bz2?