在 Redshift 中按类别选择 n 个最大计数
Posted
技术标签:
【中文标题】在 Redshift 中按类别选择 n 个最大计数【英文标题】:Select n largest count by category in Redshift 【发布时间】:2017-07-28 00:31:00 【问题描述】:我想在表格中为每组选择 X 个最常见的配对。 让我们考虑下表:
+-------------+-----------+
| identifier | city |
+-------------+-----------+
| AB | Seattle |
| AC | Seattle |
| AC | Seattle |
| AB | Seattle |
| AD | Seattle |
| AB | Chicago |
| AB | Chicago |
| AD | Chicago |
| AD | Chicago |
| BC | Chicago |
+-------------+-----------+
西雅图,AB 发生 2 次li>
西雅图,AC 发生 2 次li>
西雅图,AD 发生 1x
芝加哥,AB 出现 2 次li>
芝加哥,AD 发生 2 次li>
芝加哥,BC 发生 1x
如果我想选择每个城市最常见的 2 个,结果应该是:
+-------------+-----------+
| identifier | city |
+-------------+-----------+
| AB | Seattle |
| AC | Seattle |
| AB | Chicago |
| AD | Chicago |
+-------------+-----------+
感谢任何帮助。谢谢, 本尼
【问题讨论】:
Get top n records for each group of grouped results的可能重复 【参考方案1】:您可以在行号中使用count
来排序每个城市组合的出现次数并选择前两个。
select city,identifier
from (
select city,identifier
,row_number() over(partition by city order by count(*) desc,identifier) as rnum_cnt
from tbl
group by city,identifier
) t
where rnum_cnt<=2
【讨论】:
你不能在分区内使用count(*)
,至少在Redshift中,count应该在子查询中完成
@AlexYes 看来你可以。答案中的查询给了我正确的结果。此外,documentation 表示订单列表中允许使用表达式。
@DmitriiI。有趣的!当我看到文档时,我只想到标量表达式,我不知道 Redshift 这么聪明:) 谢谢!【参考方案2】:
使用WITH 子句:
with
_counts as (
select
identifier,
city,
count(*) as city_id_count
from
t1
group by
identifier,
city
),
_counts_and_max as (
select
identifier,
city,
city_id_count,
max(city_id_count) over (partition by city) as city_max_count
from
_counts
)
select
identifier,
city
from
_counts_and_max
where
city_id_count = city_max_count
;
【讨论】:
以上是关于在 Redshift 中按类别选择 n 个最大计数的主要内容,如果未能解决你的问题,请参考以下文章