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