Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 按相似列名对查询结果进行分组_Database_Postgresql - Fatal编程技术网

Database 按相似列名对查询结果进行分组

Database 按相似列名对查询结果进行分组,database,postgresql,Database,Postgresql,PostgreSQL 8.0.4版 我设法查询数据库以得到这个表,我们称它为A: 从本质上讲,这告诉我某项成就获得最多次数的前3个级别。如图所示,我通过row\u number()在acquisition\u id上对其进行了分区 我被难倒在如何查询这个问题上,这样我就得到了一个类似的表: 区别在于,第一个最大值对应于行编号=1,第二个最大值对应于行编号=2,第三个最大值对应于行编号=3 我用于获取第二个表的查询: SELECT achievement_id, level_id AS

PostgreSQL 8.0.4版

我设法查询数据库以得到这个表,我们称它为
A

从本质上讲,这告诉我某项成就获得最多次数的前3个级别。如图所示,我通过
row\u number()
acquisition\u id
上对其进行了分区

我被难倒在如何查询这个问题上,这样我就得到了一个类似的表:

区别在于,
第一个最大值
对应于
行编号=1
第二个最大值
对应于
行编号=2
第三个最大值
对应于
行编号=3

我用于获取第二个表的查询:

SELECT
  achievement_id,
  level_id AS first_max,
  level_id AS second_max,
  level_id AS third_max
FROM A
WHERE row_number = 1 --Obviously this line is wrong but not sure how to approach
尝试:

尝试:

使用

使用


令人惊讶的是,我得到了一个错误
无效操作:语法错误在“(”
)处或附近。试图解决这个问题。复制粘贴原样,问题在
总和(级别id)过滤器中(其中…
,因为如果我删除这三行,查询将起作用。此功能在Postgres 9.4中引入。始终从选择版本()显示您的PostgreSQL版本)-谢谢,我应该指定。您的解决方案比@Vao的更优雅,但我正在运行PostgreSQL 8.0.2,因此我将接受Vao的解决方案作为答案,并向您投票。感谢您的提示。令人惊讶的是,我收到了一个错误
无效操作:语法错误在或接近“(”
。正在尝试解决此问题。复制粘贴原样,问题出在
总和(级别id)筛选器中(其中…
),因为如果我删除这三行,查询将起作用。此功能在Postgres 9.4中引入。始终从选择版本()显示PostgreSQL版本-谢谢,我应该指定。您的解决方案比@Vao的更优雅,但我正在运行PostgreSQL 8.0.2,因此我将接受Vao的解决方案作为答案,并向上投票。谢谢您的提示。
select 
achievement_id,
max(first_max),
max(second_max),
max(third_max)
from (
SELECT
  achievement_id,
  case when row_number = 1 then level_id end AS first_max,
  case when row_number = 2 then level_id end AS second_max,
  case when row_number = 3 then level_id end AS third_max
FROM A
) B
group by achievement_id
SELECT
    achievement_id,
    sum(level_id) FILTER (WHERE row_number = 1) AS first_max,
    sum(level_id) FILTER (WHERE row_number = 2) AS second_max,
    sum(level_id) FILTER (WHERE row_number = 3) AS third_max
FROM A
GROUP BY 1