Повторяющиеся данные при rank () в sql bigquery - PullRequest
0 голосов
/ 07 мая 2020

Я создаю таблицу из набора данных, у которого есть столбцы, верхние N в нескольких областях и разделенные на две категории флагом ba.

Запрос, который я использую для этого, следующий:

WITH ranking as (
      SELECT  order, name, id, area, flag,
             RANK() OVER (PARTITION BY area, flag ORDER BY orders DESC) as rank
      FROM `dataset` d
    ) 

SELECT area, current_date() as date,
case when rank = 1 then CONCAT(id,'_', name) end as top_1_in_the_city,
case when rank = 2 then CONCAT(id,'_', name) end as top_2_in_the_city,
case when rank = 3 then CONCAT(id,'_', name) end as top_3_in_the_city,


case when rank = 1 AND flag = 0 then CONCAT(id,'_', name) end as top_1_in_the_city_core,
case when rank = 2 AND flag = 0 then CONCAT(id,'_', name) end as top_2_in_the_city_core,
case when rank = 3 AND flag = 0 then CONCAT(id,'_', name) end as top_3_in_the_city_core,

case when rank = 1 AND flag = 1 then CONCAT(id,'_', name) end as top_1_in_the_city_nocore,
case when rank = 2 AND flag = 1 then CONCAT(id,'_', name) end as top_2_in_the_city_nocore,
case when rank = 3 AND flag = 1 then CONCAT(id,'_', name) end as top_3_in_the_city_nocore,
FROM ranking

Но он возвращает много пустых значений и некоторые имена, которые раньше появлялись только один раз, теперь появляются в нескольких вершинах и конечно, он не может быть первым и четвертым одновременно, например:

date area  top_1_in_the_city top_2_in_the_city top_1_in_the_city_core
05/05/1989      null             James              null
05/05/1989      James            null               null 
05/05/1989      null             null               null

Ожидаемый результат был:

date area  top_1_in_the_city   top_2_in_the_city   top_1_in_the_city_core top_1_in_the_city_nocore
05/05/1989      Pedro             James              James               Pedro
05/05/1989      Arthur             Don                Arthur            Michael
05/05/1989      Fulano             John               John              Someone

Чтобы исправить это, я сначала попробовал простейший случай без флага, но имел ту же проблему. Затем я попытался объединить каждый случай, но он остался неизменным! Заранее спасибо

1 Ответ

0 голосов
/ 09 мая 2020

Принимая дикий удар, потому что вашему вопросу не хватает объяснения. Если вы пытаетесь сделать то, что я думаю, вы делаете, у вашего запроса есть 2 основные проблемы.

  1. Вы пытаетесь использовать один и тот же ранг в 2 разных контекстах. Будет проще добавить переменную 2-го ранга.
  2. Ваш запрос не ограничивает строки, поэтому вы, вероятно, получите результат для каждой отдельной строки вашей таблицы. Я предполагаю, что в этом случае вам нужна 1 строка на область.

Если моя интерпретация вашего запроса близка к правильной, я бы реорганизовал ваш запрос на что-то вроде этого:

with 
ranking as (
      SELECT  orders, name, id, area, flag, CONCAT(id,'_', name) as formatted_name,
             RANK() OVER (PARTITION BY area ORDER by orders DESC) as area_rank,
             RANK() OVER (PARTITION BY area, flag ORDER BY orders DESC) as area_flag_rank
      FROM `dataset.table` d
),
area_spine as (select distinct area from ranking),
city1 as ( select area, formatted_name as top_1_in_the_city from ranking where area_rank = 1 ),
city2 as ( select area, formatted_name as top_2_in_the_city from ranking where area_rank = 2 ),
city3 as ( select area, formatted_name as top_3_in_the_city from ranking where area_rank = 3 ),
city_core1 as ( select area, formatted_name as top_1_in_the_city_core from ranking where area_flag_rank = 1 and flag = 0),
city_core2 as ( select area, formatted_name as top_2_in_the_city_core from ranking where area_flag_rank = 2 and flag = 0 ),
city_core3 as ( select area, formatted_name as top_3_in_the_city_core from ranking where area_flag_rank = 3 and flag = 0 ),
city_nocore1 as ( select area, formatted_name as top_1_in_the_city_nocore from ranking where area_flag_rank = 1 and flag = 1),
city_nocore2 as ( select area, formatted_name as top_2_in_the_city_nocore from ranking where area_flag_rank = 2 and flag = 1),
city_nocore3 as ( select area, formatted_name as top_3_in_the_city_nocore from ranking where area_flag_rank = 3 and flag = 1),
joined as (
  select *
  from area_spine
  left join city1 using(area)
  left join city2 using(area)
  left join city3 using(area)
  left join city_core1 using(area)
  left join city_core2 using(area)
  left join city_core3 using(area)
  left join city_nocore1 using(area)
  left join city_nocore2 using(area)
  left join city_nocore3 using(area)
)
select * from joined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...