Как я могу добавить счетчик для ранжирования нулевых значений в SQL Hive?

#sql #hive #null #window-functions #rank

#sql #улей #null #окно-функции #ранг

Вопрос:

Это то, что у меня есть прямо сейчас:

 | time  | car_id | order | in_order |
|-------|--------|-------|----------|
| 12:31 | 32     | null  | 0        |
| 12:33 | 32     | null  | 0        |
| 12:35 | 32     | null  | 0        |
| 12:37 | 32     | 123   | 1        |
| 12:38 | 32     | 123   | 1        |
| 12:39 | 32     | 123   | 1        |
| 12:41 | 32     | 123   | 1        |
| 12:43 | 32     | 123   | 1        |
| 12:45 | 32     | null  | 0        |
| 12:47 | 32     | null  | 0        |
| 12:49 | 32     | 321   | 1        |
| 12:51 | 32     | 321   | 1        |
  

Я пытаюсь ранжировать заказы, включая те, которые имеют нулевые значения, в данном случае по car_id.
Это результат, который я ищу:

 | time  | car_id | order | in_order | row |
|-------|--------|-------|----------|-----|
| 12:31 | 32     | null  | 0        | 1   |
| 12:33 | 32     | null  | 0        | 1   |
| 12:35 | 32     | null  | 0        | 1   |
| 12:37 | 32     | 123   | 1        | 2   |
| 12:38 | 32     | 123   | 1        | 2   |
| 12:39 | 32     | 123   | 1        | 2   |
| 12:41 | 32     | 123   | 1        | 2   |
| 12:43 | 32     | 123   | 1        | 2   |
| 12:45 | 32     | null  | 0        | 3   |
| 12:47 | 32     | null  | 0        | 3   |
| 12:49 | 32     | 321   | 1        | 4   |
| 12:51 | 32     | 321   | 1        | 4   |
  

Я просто не знаю, как управлять счетчиком для нулевых значений.
Спасибо!

Ответ №1:

Вы можете подсчитать количество ненулевых значений перед каждой строкой, а затем использовать dense_rank() :

 select t.*,
       dense_rank() over (partition by car_id order by grp) as row
from (select t.*,
             count(order) over (partition by car_id order by time) as grp
      from t
     ) t;
  

Комментарии:

1. Спасибо за помощь!