столбцов, одни из которых ModifiedOn(Datetime), Id, sum. Во все остальные столбцы могут записываться NULL. Необходимо вывести все строки, имеющие последние значения по ModifiedOn (можно сказать "схлопывая" соседние, убирая Null) и просуммировать sum. Как сделать LAST_VALUE(*) over(partition by Id order by ModifiedOn desc) для всех столбцов?
argMax(value, ModifiedOn)+group by id?
это будет одна результирующая строка а мне нужно для каждого id вывести строку, которая будет содержать последние не null значения всех столбцов согласно ModifiedOn и просуммировать для каждого id все значения sum таблицы
select id, argMaxIf(value, ModifiedOn, value is not Null), argMax(value, ModifiedOn) from table group by id
select id, sum(sum) as total, * except (id,sum,DateTime) apply (groupArray(10)) from (select * from table order by ModifiedOn desc) group by id Тут будет группировка с массивами, по 10 штук последних. Если надо - можно таким-же образом их развернуть назад через arrayJoin
---------------------------————————————- id|datetime| value1| value2|value3|...value N ---------------------------————————————- 1 |2021-01-03 14:38:02.000 |a | NULL |f | 1 |2021-01-03 15:38:02.000 |NULL |c | NULL | 2 |2021-01-03 14:38:02.000 | NULL |d |g | 2 |2021-01-03 15:38:02.000 |b |e | NULL | вот так лучше. Например: нужно схлопнуть строки так, что бы получилось для id=1|a|c|f|, а для id= 2 |b|e|g|.
получается что то не то
а если строк больше? Куда девать лишние?
в том и дело, что строк с id=1 множество, но в каких то из них столбцы получают null. Надо собрать из них одну с id=1, самым свежим datetime, забрав в результирующую строку самое последнее ненулловое значение
Если вам надо не список на 10, а ровно одно последнее - используйте аггрегатную функцию any. Вроде как оно должно пропускать Nulls. groupArray точно их выкидывает. select id, sum(sum) as total, * except (id,sum,DateTime) apply (any) from (select * from table order by ModifiedOn desc) group by id
сейчас попробую,спасибо
Обсуждают сегодня