选择按两个因素分组的前三个记录

时间:2017-04-28 16:58:43

标签: sql amazon-redshift

我正在尝试识别具有最高值的三个记录,这两个记录按两个因子分组。我意识到这个问题与PostgreSQL: select top three in each group类似,但我无法弄清楚如何从这个包含单个因子的例子推广到两个因素。我已经尝试搜索堆栈溢出以获得除上面列出的问题之外的这个问题的答案,但我找不到,但也许我没有搜索正确的术语。

简单地说,我正在连接到具有以下架构的表

city, country, value

我每个城市只有一行,国家/地区组合,但我有一个变量,但每个国家/地区的城市条目数量是可变的。例如,我有几十个城市供加拿大使用,一百个适用于美国,但只有两个适用于乌兹别克斯坦。

我想要什么,因为输出是具有相同模式的表,但只计算包含城市最高三个值的行,嵌套在国家/地区内。例如,如果加拿大的城市和价值为

{Canada, toronto, 100},     {Canada, vancouver, 80}, 
{Canada, montreal,112},     {Canada, calgary, 109}, 
{Canada, edmonton, 76},     {Canada, winnipeg, 73}, 

并且美国有

的条目
{{us, nyc, 104},     {us, chicago, 87}, 
{us, boston, 98},    {us, seattle, 105}, 
{us, sanfran, 88},   {us, minneapolis, 84}, 
{us, miami, 103},    {us, houston, 112}, 
{us, dallas, 78},    {us, tucson, 83}}

和乌兹别克斯坦有

的条目
 {uzbekistan, qarshi, 95}, {uzbeckistan, gluiston, 101}

我希望输出的是

Canada, Montreal, 112
Canada, Toronto, 100
Canada, Calgary, 109
us, houston, 112
us, seattle, 105
us, nyc, 103,
uzbeckistan, qarshi, 95
uzbeckistan, gluiston 101

我已尝试过以下查询

 SELECT logincity, logincountry, VAL
 FROM
 (
 SELECT *, ROW_NUMBER() OVER (PARTITION BY logincountry, logincity ORDER BY 
 val DESC) AS Row_ID
 FROM a_table)
 WHERE Row_ID < 4 
 ORDER BY logincity

但我最终每个国家有三个以上的城市。 有人可以帮助我吗?

谢谢Stack Overflow!

1 个答案:

答案 0 :(得分:1)

我认为你只需要通过logincountry进行分区

SELECT logincity, logincountry, VAL
FROM (
     SELECT *, 
            ROW_NUMBER() OVER (PARTITION BY logincountry 
                               ORDER BY val DESC) AS Row_ID
     FROM a_table ) T
WHERE Row_ID < 4 
ORDER BY logincity

提示:如果在SELECT

中包含Row_id,您可能会意识到问题
SELECT logincity, logincountry, VAL, Row_ID

在您的查询全部Row_ID = 1

提示2:您的查询需要每个国家/地区的前3个城市,因此您只有一个分区country。因此,链接的问题是正确的答案,在这种情况下每个组的前3名country