在psql中选择每组前5名得分结果

在psql中选择每组前5名得分结果,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我需要一些关于如何选择每个客户的前5个最关键服务器的帮助 目前我有一个select语句,它返回所有机器的主机名、SystemID、Customer和Critical值。下一步我需要做的是,为每个客户只选择最关键的前5名最关键的最高评分 我当前的select语句如下所示: SELECT COALESCE(rhss_py_results.Hostname, sid_py_results.Name) AS Hostname, COALESCE(rhss_py_results.SystemID, sec

我需要一些关于如何选择每个客户的前5个最关键服务器的帮助

目前我有一个select语句,它返回所有机器的主机名、SystemID、Customer和Critical值。下一步我需要做的是,为每个客户只选择最关键的前5名最关键的最高评分

我当前的select语句如下所示:

SELECT COALESCE(rhss_py_results.Hostname, sid_py_results.Name) AS Hostname, COALESCE(rhss_py_results.SystemID, security_scores.SystemID) AS SystemID, Customer, Critical
FROM rhss_py_results
INNER JOIN sid_py_results
ON rhss_py_results.hostname = sid_py_results.Name
INNER JOIN Customers
ON sid_py_results.SecurityDomain = Customers.SecurityDomain
INNER JOIN security_scores
ON rhss_py_results.SystemID=security_scores.SystemID
ORDER BY Customer;
它会返回与此类似的内容:由于隐私而导致的数据更改

     hostname      |  systemid  |         customer         | critical
-------------------+------------+--------------------------+----------
 aaa-aaaa_aaaa     | 1000000024 | Anna                     |       48
 aaa-aaa3-aaa1     | 1000000038 | Anna                     |        5
 aaaaaa001         | 1000000013 | Kalle                    |       10
 aaaaaa002         | 1000000043 | Kalle                    |        1
 aaaaaa005         | 1000000087 | Pelle                    |        5
 bbbbbb0010        | 1000000003 | Pelle                    |        0
 cccccc0001        | 1000000029 | Sara                     |        0
 ddd-dddd-c001     | 1000000063 | Anna                     |       26
 ddd-dddd-c002     | 1000000064 | Anna                     |       24
 ddd-dddd-c003     | 1000000012 | Anna                     |        5
 fff-ffff-f001     | 1000000095 | Anna                     |       13
 gggggg0001        | 1000000077 | Sara                     |        0
 gggggg0002        | 1000000040 | Pelle                    |        0
 gggggg0003        | 1000000039 | Pelle                    |        1
 mmmmmm033         | 1000000047 | Kalle                    |       31
 mmmmmm034         | 1000000045 | Kalle                    |       37
 mmmmmm036         | 1000000046 | Pelle                    |        3
 mmmmmm037         | 1000000082 | Pelle                    |        3
 mmmmmm045         | 1000000091 | Håkan                    |        0
一些客户只有一台服务器,其他客户只有15台,如果一个客户只有一台服务器,那么只列出一台就足够了。 如果一个客户有多台服务器的前5个关键值相同,则根据主机名返回最相关的5个即可

我有超过32个不同的客户,这个数字将来可能会有所不同

以下结果应为最终产品:

     hostname      |  systemid  |         customer         | critical
-------------------+------------+--------------------------+----------
 aaa-aaaa_aaaa     | 1000000024 | Anna                     |       48
 ddd-dddd-c001     | 1000000063 | Anna                     |       26
 ddd-dddd-c002     | 1000000064 | Anna                     |       24
 fff-ffff-f001     | 1000000095 | Anna                     |       13
 aaa-aaa3-aaa1     | 1000000038 | Anna                     |        5
 mmmmmm045         | 1000000091 | Håkan                    |        0
 mmmmmm034         | 1000000045 | Kalle                    |       37
 mmmmmm033         | 1000000047 | Kalle                    |       31
 aaaaaa001         | 1000000013 | Kalle                    |       10
 aaaaaa002         | 1000000043 | Kalle                    |        1
 aaaaaa005         | 1000000087 | Pelle                    |        5
 mmmmmm036         | 1000000046 | Pelle                    |        3
 mmmmmm037         | 1000000082 | Pelle                    |        3
 gggggg0003        | 1000000039 | Pelle                    |        1
 bbbbbb0010        | 1000000003 | Pelle                    |        0
 cccccc0001        | 1000000029 | Sara                     |        0
 gggggg0001        | 1000000077 | Sara                     |        0
我已经阅读了下面的文章,但不明白如何将其应用到我自己的查询中,因为我对数据库非常陌生

有人能帮我解决这个问题吗

//安布罗斯

按关键描述使用顺序


使用行数函数

SELECT *
FROM
  (SELECT (row_number() over (partition BY Customer
                             ORDER BY COALESCE(rhss_py_results.SystemID, security_scores.SystemID) DESC)) AS sno,
                       COALESCE(rhss_py_results.Hostname, sid_py_results.Name) AS Hostname,
                       COALESCE(rhss_py_results.SystemID, security_scores.SystemID) AS SystemID,
                       Customer,
                       Critical
   FROM rhss_py_results
   INNER JOIN sid_py_results ON rhss_py_results.hostname = sid_py_results.Name
   INNER JOIN Customers ON sid_py_results.SecurityDomain = Customers.SecurityDomain
   INNER JOIN security_scores ON rhss_py_results.SystemID=security_scores.SystemID
   ORDER BY Customer) AS t
WHERE sno<=5;

这一个根本没有给前五名,只是命令他们。。。。因此,这不是我所问的,这一点很接近,但并不完全符合它的要求。老实说,我不知道它能做什么。因为它不会返回前五名,也不会返回后五名。它返回每个类别中的5个,但我不知道这5个类别有什么共同点。比如说,如果Pelly的服务器具有关键的0、0、0、0、0、0、0、1、2、4、11、12、15、18、28、31、31、31。。。它返回的是0,0,0,4,15,不是确切的数字,但我希望你明白我的意思:我在你原来的帖子中编辑了一些错误,没有按正确的内容排序,还有一个小的打字错误。它现在运行正常,我会接受你的回答。谢谢好啊谢谢你的评论
SELECT *
FROM
  (SELECT (row_number() over (partition BY Customer
                             ORDER BY COALESCE(rhss_py_results.SystemID, security_scores.SystemID) DESC)) AS sno,
                       COALESCE(rhss_py_results.Hostname, sid_py_results.Name) AS Hostname,
                       COALESCE(rhss_py_results.SystemID, security_scores.SystemID) AS SystemID,
                       Customer,
                       Critical
   FROM rhss_py_results
   INNER JOIN sid_py_results ON rhss_py_results.hostname = sid_py_results.Name
   INNER JOIN Customers ON sid_py_results.SecurityDomain = Customers.SecurityDomain
   INNER JOIN security_scores ON rhss_py_results.SystemID=security_scores.SystemID
   ORDER BY Customer) AS t
WHERE sno<=5;