GroupKind.Local + Table.ReverseRows или группировка снизу

#АнатомияФункций – Table.Group, Table.Reverse.Rows



Всем привет!

В старом добром танке уже был пост, но поскольку никто не читает старый танк, записал видео.

Разбираем локальную группировку, в ходе которой необходимо ориентироваться на последнюю строку в группе (или на предыдущую строку – это эквивалентно).

Сначала решаем в лоб:

let

f=(x)=>[a=x{0},

b=Table.Last(x)[DateTime],

c=[Date=a[Date],Agent=a[Agent],Ready=a[DateTime],Logout=b,Duration=Duration.TotalMinutes(Logout-Ready)],

d=if Table.RowCount(x)<2 then null else c][d],

from = Excel.CurrentWorkbook(){[Name="big"]}[Content],

fltr = Table.SelectRows(from,(x)=>x[State]="Ready" or x[State]="Logout"),

lst = List.Buffer({"Logout"}&fltr[State]),

add = Table.AddIndexColumn(fltr,"prev"),

tr = Table.TransformColumns(add,{"prev",(x)=>lst{x}}),

gr = Table.Group(tr,"prev",{"tmp",f},GroupKind.Local,(s,c)=>Number.From(c="Logout")),

to = Table.FromRecords(List.RemoveNulls(gr[tmp]))

in

to


А потом по-человечески:

let

f=(x)=>[b=x{0}[DateTime],

a=Table.Last(x),

c=[Date=a[Date],Agent=a[Agent],Ready=a[DateTime],Logout=b,Duration=Duration.TotalMinutes(Logout-Ready)],

d=if Table.RowCount(x)<2 then null else c][d],

from = Excel.CurrentWorkbook(){[Name="big"]}[Content],

fltr = Table.SelectRows(from,(x)=>x[State]="Ready" or x[State]="Logout"),

tr = Table.ReverseRows(fltr),

gr = Table.Group(tr,"State",{"tmp",f},GroupKind.Local,(s,c)=>Number.From(c="Logout")),

to = Table.FromRecords(List.RemoveNulls(gr[tmp]))

in

to


Зачем и почему оно так смотрим:

С исходниками на спонсоре



А также на рутубе, в дзене и скоро зальётся на ютуб

Лайк, коммент, подписка приветствуются )))



Надеюсь, было полезно.

Всех благ!

@buchlotnik