Forum Discussion
Calculating kWh based on datetime and kW
- 6 years ago
This turned out to be much more challenging than expected. Power BI kept running out of memory even though it is running on 32 GB. I ended up presorting the data in SQL server (and adding the index row there)
SELECT ROW_NUMBER() OVER(ORDER BY [Telemetry AssetID ] ,[Telemetry PointName ] ,[Telemetry Timetag ] asc) Row, [Telemetry SiteID ] [SiteID] ,[Telemetry AssetID ] [AssetID] ,[Telemetry PointName ] [PointName] ,[Telemetry Timetag ] [Timetag] ,[Telemetry Units ] [Units] ,[Telemetry ELECTRICITY_MAP ] [ELECTRICITY_MAP] ,[Telemetry StoreID ] [StoreID] ,[Telemetry date_key ] [date_key] FROM [Telemetry]Then the calculated column can be written as such: (shown in two variations)
kWh = var i = Telemetry[Row] var t = Telemetry[Timetag] var ap = Telemetry[AssetID] & Telemetry[PointName] var f = filter(Telemetry,Telemetry[Row]=i-1) var pt = SELECTCOLUMNS(f,"pt",Telemetry[Timetag]) var pv = SELECTCOLUMNS(f,"pv",Telemetry[ELECTRICITY_MAP]) var pap= SELECTCOLUMNS(f,"pap",Telemetry[AssetID] & Telemetry[PointName]) //var pt = maxx(f,Telemetry[Timetag]) //var pv = maxx(f,Telemetry[ELECTRICITY_MAP]) //var pap = maxx(f,Telemetry[AssetID] & Telemetry[PointName]) return if (ap=pap,divide(Telemetry[ELECTRICITY_MAP]+pv,120)*DATEDIFF(pt,t,MINUTE),0)and the calculation yields the expected result.
Thank you for the challenge. I'm still baffled that Power BI struggles with such a seemingly small dataset (7.8M rows) but I guess there are a few cartesian products happening that explode the memory needs. Hope someone else can find a faster solution.
i'm running out of memory while performing this calculated column. I added now an Index (Row) and tried it with your posted formula from above (slightly adapted) and this works very smooth.
kWh =
var i = 'data (1)'[Row]
var t = 'data (1)'[Timestamp]
var f = filter('data (1),'data (1)'[Row]=i-1)
var pt = SELECTCOLUMNS(f,"pt",'data (1)'[Timestamp])
var pv = SELECTCOLUMNS(f,"pv",'data (1)'[kW])
return(divide('data (1)'[kW]+pv,120)*DATEDIFF(pt,t,MINUTE))
Your data has sub-minute granularity. I would be wary about using DATEDIFF.
- lbendlin4 years ago
Super User
Anonymous Here is a good solution that is accurate and performant:
Add index column in Power Query.
Add calculated column:
kWh = var idx= 'data'[Index]-1 var pts = COALESCE(CALCULATE(max('data'[Timestamp]),All('data'),'data'[Index]=idx),'data'[Timestamp]) var ptsw = CALCULATE(sum('data'[kW]),All('data'),'data'[Index]=idx) return ('data'[kW]+ptsw)*12*('data'[Timestamp]-pts)see attached.
- Anonymous4 years agoNot applicable
lbendlin This works great! Thanks a lot for your help!