【发布时间】:2017-12-21 19:45:12
【问题描述】:
在其中一张表中,我有多个字段,其中有一个排名字段。所有这些字段都有一个共同的分组属性,我需要根据该属性找到可以存在于组的任何记录中的排名最高的列值。例如,让我们考虑以下数据:
+---------+---------------+-----------+-----------------+-------------+----------------------+------------+
| Country | City | City_Rank | Artist | Artist_Rank | Movie | Movie_Rank |
+---------+---------------+-----------+-----------------+-------------+----------------------+------------+
| USA | Las Vegas | 2 | Louis C.K | 2 | Justice League | 3 |
| USA | New York City | 3 | Michael Flynn | 3 | IT | 1 |
| USA | Los Angeles | 1 | Matt Lauer | 1 | Get Out | 2 |
| UK | Leeds | 2 | Jack Maynard | 3 | Beauty and the Beast | 2 |
| UK | Manchester | 3 | Charlie Gard | 1 | Wonder Woman | 1 |
| UK | London | 1 | Shannon Mathews | 2 | Logan | 3 |
+---------+---------------+-----------+-----------------+-------------+----------------------+------------+
现在我需要 City、Artist 和 Movie 的 Rank 1,按单个记录中的 Country 分组。所以预期的输出是:
+---------+------------------+--------------------+-------------------+
| Country | Best_Ranked_City | Best_Ranked_Artist | Best_Ranked_Movie |
+---------+------------------+--------------------+-------------------+
| USA | Los Angeles | Matt Lauer | IT |
| UK | London | Charlie Gard | Wonder Woman |
+---------+------------------+--------------------+-------------------+
我有更多的属性,我有排名字段。我可以通过为每个排名字段(其中 rank=1)形成上述多个数据集并通过组字段连接这些数据集来获得所需的输出。
但是,由于表中有数百万条记录,这是一件相当昂贵的事情,并且多次过滤和加入此数据集似乎并不是解决此问题的最佳方法。通过在其上应用一些业务逻辑,我使用Rank() windows 函数达到了每个字段的排名。
我希望仅在可能的情况下使用 Window 函数进一步解决此问题。
【问题讨论】:
-
这听起来像是一个 SQL 问题,但代码是 html 格式的。如果是 sql 问题,您可以发布您需要帮助的 SQL 吗?如果不是,也许可以澄清一下究竟有什么帮助。
-
我已经重新格式化为 ASCII 表 - 我想这就是你想要的?
标签: sql postgresql-9.4 rank