我想获取每个分区块的最大值,并找到相关的ID(在同一行中)。然后,我想将单数的show_id用作“优胜者”,并在bool_flag中将同一分区中的所有行都具有匹配的show_id。
我在实现此功能时遇到了麻烦,尤其是在窗口函数方面–我遇到了多个问题,说不支持子查询,或者“必须出现在GROUP BY子句中或在聚合函数sql中使用”
subQ1 as (
select subQ0.*,
case
**when show_id =
(select id from (select show_id, max(rn_max_0)
over (partition by tv_id, show_id)))**
then 1
else 0
end as winner_flag
from subQ0
)
我所拥有的:
tv_id show_id partition_count
1 42 1
1 42 2
1 42 3
1 7 1
2 12 1
2 12 2
2 12 3
2 27 1
我想要的:
tv_id show_id partition_count flag
1 42 1 1
1 42 2 1
1 42 3 1
1 7 1 0
2 12 1 1
2 12 2 1
2 12 3 1
2 27 1 0
由于tv_id 1与show_id 42的连接最多,因此这些行会被标记。
理想情况下,类似于SQL select only rows with max value on a column,但是分区和分组导致了问题。此数据集还具有数十亿行,因此联合将是一场噩梦。
谢谢!
答案 0 :(得分:0)
对于每个tv_id
,您似乎想要出现最多的show_id
。如果是这样:
select s.*,
(case when cnt = max(cnt) over (partition by tv_id)
then 1 else 0
end) as flag
from (select s.*, count(*) over (partition by tv_id, show_id) as cnt
from subQ0 s
) s;