SQL / Bigquery rank или row_number, сбрасываемый при изменении значения столбца - PullRequest
1 голос
/ 30 октября 2019

У меня есть таблица sql (bigquery), как показано ниже.

| Name  | DaysToGo |Task    |ID  |
|:-----:|:--------:|:------:|:--:|
| Joe   | 50       | A      | 1  |
| Joe   | 49       | A      | 2  |
| Joe   | 48       | B      | 1  |
| Joe   | 47       | B      | 2  |
| Joe   | 46       | B      | 3  |
| Joe   | 45       | A      | 1  |
| Joe   | 47       | A      | 2  |
| Joe   | 46       | A      | 3  |
| Tim   | 50       | B      | 1  |
| Tim   | 49       | B      | 2  |
| Tim   | 48       | B      | 3  |
| Tim   | 47       | C      | 1  |
| Tim   | 46       | B      | 1  |
| Tim   | 45       | B      | 2  |
| Tim   | 47       | C      | 1  |
| Tim   | 46       | C      | 2  |

Я хочу создать столбец "ID" на основе изменений в столбце "Задача", разделив по имени. По сути, «ID» должен сбрасываться в 1 каждый раз, когда «Задача» изменяется, и перезапускать счетчик идентификаторов с 1.

Я пытался использовать функции ранга, номера строки и даже задержки, но, похоже, не смог получитьк правильному решению. Есть идеи?

1 Ответ

2 голосов
/ 30 октября 2019

Это тип проблемы пробелов и островков. В этом случае я бы порекомендовал разницу номеров строк:

select t.*,
       row_number() over (partition by name, task, seqnum - seqnum_t
                          order by daystogo desc
                         ) as id
from (select t.*,
             row_number() over (partition by name order by daystogo) as seqnum,
             row_number() over (partition by name, task order by daystogo) as seqnum_t
      from t
     ) t;

Почему эту работу немного сложно объяснить. Если вы посмотрите на результаты подзапроса, вы увидите, как разница между двумя значениями row_number() определяет смежные задачи для каждого человека. Внешний запрос использует эту разницу, чтобы назначить новый row_number() для окончательного результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...