如何根据最大列值查找对应的行数据?

时间:2019-06-13 21:03:35

标签: sql

我想获取每个分区块的最大值,并找到相关的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,但是分区和分组导致了问题。此数据集还具有数十亿行,因此联合将是一场噩梦。

谢谢!

1 个答案:

答案 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;