Функции окна куста: последнее значение предыдущего раздела - PullRequest
0 голосов
/ 03 сентября 2018

Используя оконные функции Hive, я бы хотел получить последнее значение предыдущего раздела:

| name | rank | type |
| one  | 1    | T1   |
| two  | 2    | T2   |
| thr  | 3    | T2   |
| fou  | 4    | T1   |
| fiv  | 5    | T2   |
| six  | 6    | T2   |
| sev  | 7    | T2   |

Следующий запрос:

SELECT 
  name, 
  rank, 
  first_value(rank over(partition by type order by rank)) as new_rank 
FROM my_table

даст:

| name | rank | type | new_rank |
| one  | 1    | T1   |   1      |
| two  | 2    | T2   |   2      |
| thr  | 3    | T2   |   2      |
| fou  | 4    | T1   |   4      |
| fiv  | 5    | T2   |   5      |
| six  | 6    | T2   |   5      |
| sev  | 7    | T2   |   5      |

Но мне нужно «последнее значение предыдущего раздела»:

| name | rank | type | new_rank |
| one  | 1    | T1   |   NULL   |
| two  | 2    | T2   |   1      |
| thr  | 3    | T2   |   1      |
| fou  | 4    | T1   |   3      |
| fiv  | 5    | T2   |   4      |
| six  | 6    | T2   |   4      |
| sev  | 7    | T2   |   4      |

1 Ответ

0 голосов
/ 03 сентября 2018

Это выглядит довольно сложно. Это вариант группы и островов. Вот идея:

  1. Определите «острова», где тип одинаковый (с использованием разницы номеров строк).
  2. Затем используйте lag(), чтобы ввести предыдущий ранг на остров.
  3. Выполните минимальное сканирование, чтобы получить новый ранг, который вы хотите.

Итак:

with gi as (
      select t.*,
             (seqnum - seqnum_t) as grp
      from (select t.*,
                   row_number() over (partition by type order by rank) as seqnum_t,
                   row_number() over (order by rank) as seqnum
            from t
           ) t
      ),
      gi2 as (
       select gi.*, lag(rank) over (order by gi.rank) as prev_rank
       from gi
      )
select gi2.*,
       min(prev_rank) over (partition by type, grp) as new_rank
from gi2
order by rank;

Здесь - скрипта SQL (хотя и с использованием Postgres).

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