как стать старейшим и самым новым в улье - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть таблица с именем signal и следующими столбцами

  1. entity_id
  2. item_id
  3. month_id
  4. signal_count

входная таблица:

| entity_id | item_id | month_id | signal_count |

     101         3        2015           2
     104         4        2017           1
     101         1        2017           1
     104         2        2016           0
     107         2        2011           1
     107         0        2011           2

Мне нужна сумма signal_count и item_id как старейшего_item_id и newest_item_id на основе month_id и группировки по entity_id

, а month_id совпадает, а затем принять наименьшее значениеitem_id

Ожидаемый результат будет следующим:

| entity_id | oldest_item_id | newest_month_id | signal_count |

     101             3                1               3 
     104             2                4               1
     107             0                0               3

1 Ответ

0 голосов
/ 30 ноября 2018

Используйте sum оконную функцию, чтобы получить сумму для entity_id и first_value, чтобы получить самый старый и самый новый item_id на основе желаемого порядка в month_id.

select distinct entity_id,oldest_item_id,newest_item_id,signal_count_sum
from (select t.*
            ,sum(signal_count) over(partition by entity_id) as signal_sum
            ,first_value(item_id) over(partition by entity_id order by month_id) as oldest_item_id
            ,first_value(item_id) over(partition by entity_id order by month_id desc) as newest_item_id          
      from tbl t
     ) t

Чтобы разорвать связи и получить наименьший item_idв случае наличия нескольких строк с одинаковым month_id для entity_id добавьте item_id к order by со спецификацией rows.

select distinct entity_id,oldest_item_id,newest_item_id,signal_count_sum
from (select t.*
            ,sum(signal_count) over(partition by entity_id) as signal_sum
            ,first_value(item_id) over(partition by entity_id order by month_id,item_id rows unbounded preceding) as oldest_item_id
            ,first_value(item_id) over(partition by entity_id order by month_id desc,item_id rows unbounded preceding) as newest_item_id          
      from tbl t
     ) t
...