bigquery, ранг до определенной строки

Я уже пробовал,

dens_rank () over (разбиение по TEAM_CD)

я хочу оценить TEAM_CD, прежде чем "правда" приходит. Как это!!

TEAM_CD     RANK    
-------------------
false       1        
true        2         
false       1       
false       2   
false       3    
true        4         
false       1          
true        2 

я пользуюсь Bigquery, Legacy SQL!! Помоги мне!!!! (Я не очень хорошо пишу по-английски....)

1 ответ

Как упоминал Эллиотт - вам нужен какой-то способ определить порядок. В вашей таблице должен быть какой-то столбец, который вы будете использовать для его определения. Это может быть любой столбец заказываемого типа.
Принимая во внимание, что есть pos столбец в вашей таблице - ниже запрос будет делать то, что вы просили (это для BigQuery Standard SQL)

#standardSQL
SELECT 
  pos, 
  team_cd, 
  DENSE_RANK() OVER(PARTITION BY grp ORDER BY pos) AS RANK
FROM (
  SELECT 
    pos, 
    team_cd, 
    COUNTIF(team_cd) OVER(ORDER BY pos ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS grp
  FROM `project.dataset.table`
)
-- ORDER BY pos

Вы можете протестировать / поиграть с ним, используя dummydata из вашего вопроса, как показано ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 AS pos, FALSE AS team_cd UNION ALL
  SELECT 2, TRUE UNION ALL
  SELECT 3, FALSE UNION ALL
  SELECT 4, FALSE UNION ALL
  SELECT 5, FALSE UNION ALL
  SELECT 6, TRUE UNION ALL
  SELECT 7, FALSE UNION ALL
  SELECT 8, TRUE 
)
SELECT 
  pos, 
  team_cd, 
  DENSE_RANK() OVER(PARTITION BY grp ORDER BY pos) AS RANK
FROM (
  SELECT 
    pos, 
    team_cd, 
    COUNTIF(team_cd) OVER(ORDER BY pos ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS grp
  FROM `project.dataset.table`
)
ORDER BY pos

Если по какой-то причине вы все еще привязаны к BigQuery Legacy SQL, вы можете использовать ниже (но подумайте о переходе на стандартный SQL - это настоятельно рекомендуется BigQuery Team)

#legacySQL
SELECT 
  pos, 
  team_cd, 
  DENSE_RANK() OVER(PARTITION BY grp ORDER BY pos) AS RANK
FROM (
  SELECT pos, team_cd, IFNULL(grp, 0) grp
  FROM (
    SELECT 
      pos, 
      team_cd, 
      SUM(team_cd) OVER(ORDER BY pos ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS grp
    FROM [project:dataset.table]
  )
)
ORDER BY pos
Другие вопросы по тегам