Страницы: 1
RSS
PQ Разница между дат внутри таблицы
 
Привет
У меня есть таблица с датами операций по менеджерам.
Мне интересно высчитывать перерыв между операциями.
Например, в данном случае для менеджера 1 нужно посчитать разницу между 4 строчкой и 2, 6 и 4, 8 и 6. То есть мне нужен перерыв между текущей строчкой и предыдущей операцией.
Для менеджера 2 соответственно разницу между 5 и 3,7 и 5.
Разницу вывести в отдельный столбец и сделать это в PQ.
Помогите пожалуйста, благодарю!

Изменено: Vsevolod - 15.09.2019 17:26:01
 
Вы ТОЧНО про даты спрашиваете?
 
Топорненько, конечно:
Код
let
    from = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    group = Table.Group(from, {"Менеджер"}, {{"temp", each [#"Дата операции"], type table}}),
    join = Table.NestedJoin(from,"Менеджер",group,"Менеджер","All"),
    lists = Table.TransformColumns(join,{{"All", each [temp]{0}}}),
    diff = Table.AddColumn(lists, "Difference", each try [Дата операции]-List.Skip([All],List.PositionOf([All],[Дата операции])-1){0} otherwise #duration(0,0,0,0)),
    to = Table.RemoveColumns(diff,{"All"})
in
    to
Изменено: buchlotnik - 16.09.2019 09:12:34
Соблюдение правил форума не освобождает от модераторского произвола
 
Юрий М, Не совсем понял Ваш вопрос. Дата=ДатаВремя, пытаюсь высчитать разницу между двемя ДатойВременем для одинаковых менеджеров.
buchlotnik,  спасибо огромное! Разбираюсь!  
 
buchlotnik, на большой выборке по 1 записи просчитывает в секунду(  
 
Вижу PooHkrd читает тему:) Подскажете оптимальный пожалуйста алгоритм?  
 
Выглядит более громоздко чем у buchlotnik, но на больших массивах такой алгоритм просто летает по сравнению с джойнами и выборкой из списка по условию.
Код
let
    Source = Table.TransformColumnTypes( Excel.CurrentWorkbook(){[Name="Table1"]}[Content], {{"Менеджер", type text}, {"Дата операции", type datetime}} ),
    GroupedRows = Table.Group(Source, {"Менеджер"}, {{"таб", each 
        [a = Table.Sort(_,{{"Дата операции", Order.Ascending}}),
         b = Table.ToColumns( a ) & { {null} & List.FirstN( a[Дата операции], Table.RowCount(a) - 1 ) },
         c = Table.FromColumns( b, Table.ColumnNames( a ) & {"Пред." & List.Last( Table.ColumnNames( a ) )} )][c], type table}}),
    Custom1 = Table.Combine( GroupedRows[таб] ),
    ChangedType = Table.TransformColumnTypes(Custom1,{{"Пред.Дата операции", type datetime}}),
    AddedCustom = Table.AddColumn(ChangedType, "Разность", each [Дата операции] - [Пред.Дата операции], type duration),
    SortedRows = Table.Sort(AddedCustom,{{"Дата операции", Order.Ascending}})
in
    SortedRows

Для себя из ссылки сварганил такую вот универсальную функцию по добавлению к таблице столбцов со смещением.
Скрытый текст
Изменено: PooHkrd - 16.09.2019 09:39:57
Вот горшок пустой, он предмет простой...
 
PooHkrd, спасибо за ссылку!
Единственное - в данном конкретном случае сортировка вроде как не нужна - данные в хронологии идут
Скрытый текст
Изменено: buchlotnik - 16.09.2019 10:12:08
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
в данном конкретном случае сортировка вроде как не нужна - данные в хронологии идут
Вроде бы Макс Зеленский где-то писал что группировка не гарантирует сохранение порядка строк в фильтруемых таблицах, поэтому береженого бог бережет
Скрытый текст
 :D
Вот горшок пустой, он предмет простой...
 
PooHkrd,  это круто! Спасибо Вам огромное! Единственное, когда я начал на свой большой массив данных натягивать у меня строчка
Код
 ChangedType = Table.TransformColumnTypes(Custom1,{{"Пред.Дата операции", type datetime}}),
Ругалась что такого поля нет. Так как почему-то у меня поле назвалось Пред.userID
Код
c = Table.FromColumns( b, Table.ColumnNames( a ) & {"Пред." & List.Last( Table.ColumnNames( a ) )} )][c], type table}}),
Видно, оно взялось вот от сюда, но я не понял эту строчку воопще)
Тупо сделал переименование, и все заработало.

Спасибо вам огромное
 
Цитата
Vsevolod написал:
Юрий М , Не совсем понял Ваш вопрос
Я акцентировал внимание на слове дата: у Вас в примере все даты одинаковые ))
По факту требуется посчитать время.
 
Цитата
Vsevolod написал:
Видно, оно взялось вот от сюда
Да, отсюда. Это я перемудрил малость запишите эту строку так:
Код
c = Table.FromColumns( b, Table.ColumnNames( a ) & {"Пред.Дата операции"} )][c], type table}}),

Тогда не потребуется ничего потом переименовывать.
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх