2017-02-14 2 views
1

После этого question.Вставка в таблицы закрытия строк при сохранении столбца даты

Мой стол

id sum type date 
1  3  -1  2017-02-02 
1  6  -1  2017-02-04 
1  -6  2  2017-02-01 
1  -3  1  2017-02-09 
1  3  -1  2017-02-17 
1  6  -1  2017-02-05 

Этот запрос находит людей, которые проходят условия и возвращает occurrences количество строк тех пользователей, с некоторыми столбцами модифицированными.

with t as(
select id 
    , -abs (sum) as sum 
    , sum (case when type = -1 then 1 else -1 end) as occurrences 
    --, collect_list(date) as time_col 
from table 
group by id, abs(sum) 
having sum (case when type = -1 then 1 else -1 end) > 15 
) 
select t.id 
    , t.sum 
    , 2 as type 
from t 
lateral view explode (split (space (cast (occurrences as int) - 1),' ')) e 
-- lateral view explode(time_col) time_table as time_key; 

Проблема в том, что каждая строка должна содержать один столбец даты из списка. Я пытался добавить, а затем collect_list(date) as time_col

lateral view explode(time_col) time_table as time_key; 

, но это только что вернулись все возможные комбинации. Возможно, я мог бы использовать соединение (это работает?), Но я подумал, действительно ли это необходимо.

В конце концов эти строки

1  3  -1  2017-02-17 
1  6  -1  2017-02-05 

будет превращаться в

1  -3  2 2017-02-17 
1  -6  2 2017-02-05 
+0

Вы можете показать желаемые результаты? –

+0

Если вам не нужна дата, то просто используйте 'COLLECT_LIST (date) [0]' или 'MAX (date)' или 'MIN (date)' – gobrewers14

+0

Я бы предложил изменить тему ... –

ответ

1
select  val_id 
      ,-val_sum as val_sum 
      ,2   as val_type 
      ,val_date 

from  (select  val_id 
         ,val_sum 
         ,val_type 
         ,val_date 

         ,sum (case when val_type = -1 then 1 else -1 end) over 
         (
          partition by val_id,-abs (val_sum) 
         ) as occurrences 

         ,row_number() over 
         (
          partition by val_id,val_sum 
          order by  val_date desc 
         ) as rn 

      from  mytable 
      ) t 

where  val_type  = -1 
     and rn   <= occurrences 
     and occurrences > 15 
; 

результатов выполнения (без and occurrences > 15)

+--------+---------+----------+------------+ 
| val_id | val_sum | val_type | val_date | 
+--------+---------+----------+------------+ 
| 1  | -3  | 2  | 2017-02-17 | 
+--------+---------+----------+------------+ 
| 1  | -6  | 2  | 2017-02-05 | 
+--------+---------+----------+------------+ 
Смежные вопросы