<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: How to calculate cost of each table for the specific Databricks Run ID in Data Engineering</title>
    <link>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167145#M55648</link>
    <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Hi Bhawana,&lt;/P&gt;&lt;P&gt;I tried to implement the code as shown below, but how can I validate whether it is returning the correct results? Also, we are planning to enable the Genie workspace — if someone provides a table name, it should return the table name, run ID, and average cost of that runs (&lt;BR /&gt;select job_id, day, sum(cost_consumed) as cost_val&lt;BR /&gt;from schemaname.tablename&lt;BR /&gt;group by job_id, day&lt;BR /&gt;),&lt;/P&gt;&lt;P&gt;-- job cte&lt;/P&gt;&lt;P&gt;base_data as (&lt;BR /&gt;select *,&lt;BR /&gt;setup_duration_seconds + execution_duration_seconds as total_run_duration,&lt;BR /&gt;to_date(period_start_time) as execution_date&lt;BR /&gt;from system.lakeflow.job_task_run_timeline&lt;BR /&gt;where workspace_id IN ('123456', '107893')&lt;BR /&gt;),&lt;/P&gt;&lt;P&gt;job_names as (&lt;BR /&gt;select job_id, name as job_name&lt;BR /&gt;from system.lakeflow.jobs&lt;BR /&gt;),&lt;/P&gt;&lt;P&gt;data as (&lt;BR /&gt;select&lt;BR /&gt;*,&lt;BR /&gt;avg(execution_duration_seconds) over (&lt;BR /&gt;partition by job_id, to_date(period_start_time), task_key&lt;BR /&gt;) as avg_task_exec_for_day,&lt;/P&gt;&lt;P&gt;avg(sum(execution_duration_seconds)) over (&lt;BR /&gt;partition by job_id, to_date(period_start_time), parent_run_id&lt;BR /&gt;) over (partition by job_id, to_date(period_start_time))&lt;BR /&gt;as avg_exec_for_day&lt;BR /&gt;from base_data&lt;BR /&gt;)&lt;/P&gt;&lt;P&gt;select distinct&lt;BR /&gt;d.job_id,&lt;BR /&gt;j.job_name,&lt;BR /&gt;d.execution_date,&lt;BR /&gt;d.task_key,&lt;BR /&gt;split_part(d.task_key, '-', 1) as ctlg,&lt;BR /&gt;split_part(d.task_key, '-', 2) as db_name,&lt;BR /&gt;split_part(d.task_key, '-', 3) as tbl_name,&lt;BR /&gt;d.avg_task_exec_for_day,&lt;BR /&gt;d.avg_exec_for_day,&lt;BR /&gt;round(d.avg_task_exec_for_day / d.avg_exec_for_day, 3) as task_lvls_weightage,&lt;BR /&gt;round(c.cost_val, 5) as job_lvl_cost_in_usd,&lt;BR /&gt;round(task_lvls_weightage * c.cost_val, 5) as task_lvl_cost_in_usd&lt;BR /&gt;from data d&lt;BR /&gt;left join cost_agg c on c.job_id = d.job_id and c.day = d.execution_date&lt;BR /&gt;left join job_names j on d.job_id = j.job_id&lt;BR /&gt;where d.job_id = 155301936099512&lt;BR /&gt;order by execution_date desc, task_lvls_weightage desc&lt;/P&gt;</description>
    <pubDate>Tue, 01 Sep 2026 13:11:52 GMT</pubDate>
    <dc:creator>Dolly0503</dc:creator>
    <dc:date>2026-09-01T13:11:52Z</dc:date>
    <item>
      <title>How to calculate cost of each table for the specific Databricks Run ID</title>
      <link>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167086#M55638</link>
      <description>&lt;P class=""&gt;Hi Databricks Community,&lt;/P&gt;&lt;P&gt;I need help calculating &lt;STRONG&gt;table-level cost for each specific Job Run ID&lt;/STRONG&gt; in Databricks.&lt;/P&gt;&lt;P&gt;I have multiple pipelines/jobs, and the same table can run multiple times with different Run IDs.&lt;/P&gt;&lt;P&gt;For example:&lt;BR /&gt;Job A&lt;BR /&gt;│&lt;BR /&gt;├── Run ID 1001&lt;BR /&gt;│ ├── Table A → $5&lt;BR /&gt;│ └── Table B → $3&lt;BR /&gt;│&lt;BR /&gt;├── Run ID 1002&lt;BR /&gt;│ ├── Table A → $7&lt;BR /&gt;│ └── Table C → $4&lt;BR /&gt;│&lt;BR /&gt;└── Run ID 1003&lt;BR /&gt;└── Table A → $6&lt;/P&gt;&lt;P&gt;I need the o/p to be&amp;nbsp;&lt;/P&gt;&lt;P&gt;Job ID Run ID Table Table Cost&lt;/P&gt;&lt;TABLE width="227px"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="50.8021px"&gt;Job A&lt;/TD&gt;&lt;TD width="46.2604px"&gt;1001&lt;/TD&gt;&lt;TD width="64.7083px"&gt;Table A&lt;/TD&gt;&lt;TD width="64.5625px"&gt;$5&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="50.8021px"&gt;Job A&lt;/TD&gt;&lt;TD width="46.2604px"&gt;1001&lt;/TD&gt;&lt;TD width="64.7083px"&gt;Table B&lt;/TD&gt;&lt;TD width="64.5625px"&gt;$3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="50.8021px"&gt;Job A&lt;/TD&gt;&lt;TD width="46.2604px"&gt;1002&lt;/TD&gt;&lt;TD width="64.7083px"&gt;Table A&lt;/TD&gt;&lt;TD width="64.5625px"&gt;$7&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="50.8021px"&gt;Job A&lt;/TD&gt;&lt;TD width="46.2604px"&gt;1002&lt;/TD&gt;&lt;TD width="64.7083px"&gt;Table C&lt;/TD&gt;&lt;TD width="64.5625px"&gt;$4&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="50.8021px"&gt;Job A&lt;/TD&gt;&lt;TD width="46.2604px"&gt;1003&lt;/TD&gt;&lt;TD width="64.7083px"&gt;Table A&lt;/TD&gt;&lt;TD width="64.5625px"&gt;$6&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;&lt;STRONG&gt;The key requirement is:&lt;/STRONG&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;P&gt;If a table was executed in a particular Run ID, I want to see the cost of that table specifically for that Run ID.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;I do &lt;STRONG&gt;not&lt;/STRONG&gt; want:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;PRE&gt;&lt;SPAN&gt;Table A = $18&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;P&gt;without knowing which Run IDs contributed to that $18.&lt;/P&gt;&lt;P&gt;I want:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;PRE&gt;&lt;SPAN&gt;Table A
  Run 1001 → $5
  Run 1002 → $7
  Run 1003 → $6&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;P&gt;I am currently exploring:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;system.billing.usage&lt;/LI&gt;&lt;LI&gt;system.billing.list_prices&lt;/LI&gt;&lt;LI&gt;system.lakeflow.job_task_run_timeline&lt;/LI&gt;&lt;LI&gt;system.lakeflow.jobs&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;I would like to know the recommended Databricks approach to derive:&lt;/P&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;DIV class=""&gt;&lt;PRE&gt;&lt;SPAN&gt;Job ID
→ Run ID
→ Task
→ Table
→ Table Cost&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;P&gt;The solution should also ensure that the &lt;STRONG&gt;sum of table-level costs for a Run ID reconciles with the actual cost of that Run ID&lt;/STRONG&gt;, without double counting.&lt;/P&gt;&lt;P&gt;What is the best Databricks-native way to achieve this table-level cost attribution by Run ID? and also i need end to end query&lt;/P&gt;</description>
      <pubDate>Tue, 01 Sep 2026 06:32:36 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167086#M55638</guid>
      <dc:creator>Dolly0503</dc:creator>
      <dc:date>2026-09-01T06:32:36Z</dc:date>
    </item>
    <item>
      <title>Re: How to calculate cost of each table for the specific Databricks Run ID</title>
      <link>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167107#M55639</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Databricks has no &lt;/SPAN&gt;&lt;SPAN&gt;native table-level &lt;/SPAN&gt;&lt;SPAN&gt;cost. You &lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN&gt;proportionally allocate&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN&gt; run cost based &lt;/SPAN&gt;&lt;SPAN&gt;on task duration.&lt;/SPAN&gt;&lt;/P&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;PRE&gt;Table Cost = Run Cost × (Task Duration / Total Run Duration) ÷ Tables per Task&lt;/PRE&gt;&lt;H4&gt;Tables Needed&lt;/H4&gt;&lt;DIV&gt;Table Purpose &lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;system.billing.usage&lt;/TD&gt;&lt;TD&gt;DBU consumption per run&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;system.billing.list_prices&lt;/TD&gt;&lt;TD&gt;DBU → $ rate&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;system.lakeflow.job_task_run_timeline&lt;/TD&gt;&lt;TD&gt;Task duration per run&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;system.access.audit&lt;/TD&gt;&lt;TD&gt;Which tables a task touched&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;H4&gt;The Query (4 CTEs)&lt;/H4&gt;&lt;P&gt;WITH run_costs AS (&lt;BR /&gt;SELECT custom_tags['jobId'] AS job_id, custom_tags['runId'] AS run_id,&lt;BR /&gt;SUM(u.usage_quantity * lp.pricing.default) AS run_cost_usd&lt;BR /&gt;FROM system.billing.usage u&lt;BR /&gt;JOIN system.billing.list_prices lp ON u.sku_name = lp.sku_name&lt;BR /&gt;WHERE billing_origin_product = 'JOBS'&lt;BR /&gt;GROUP BY 1, 2&lt;BR /&gt;),&lt;BR /&gt;task_weights AS (&lt;BR /&gt;SELECT job_id, run_id, task_key,&lt;BR /&gt;(unix_timestamp(result_time) - unix_timestamp(start_time)) * 1.0 /&lt;BR /&gt;NULLIF(SUM(unix_timestamp(result_time) - unix_timestamp(start_time))&lt;BR /&gt;OVER (PARTITION BY job_id, run_id), 0) AS task_weight&lt;BR /&gt;FROM system.lakeflow.job_task_run_timeline&lt;BR /&gt;),&lt;BR /&gt;task_tables AS (&lt;BR /&gt;SELECT DISTINCT request_params['jobId'] AS job_id, request_params['runId'] AS run_id,&lt;BR /&gt;request_params['taskKey'] AS task_key,&lt;BR /&gt;CONCAT_WS('.', request_params['catalogName'], request_params['schemaName'],&lt;BR /&gt;request_params['tableName']) AS table_name&lt;BR /&gt;FROM system.access.audit&lt;BR /&gt;WHERE service_name = 'unityCatalog' AND request_params['jobId'] IS NOT NULL&lt;BR /&gt;),&lt;BR /&gt;table_counts AS (&lt;BR /&gt;SELECT job_id, run_id, task_key, COUNT(*) AS table_cnt FROM task_tables GROUP BY 1,2,3&lt;BR /&gt;)&lt;BR /&gt;SELECT j.name AS job_name, tw.job_id, tw.run_id, tw.task_key, tt.table_name,&lt;BR /&gt;ROUND(rc.run_cost_usd * tw.task_weight / tc.table_cnt, 4) AS table_cost_usd&lt;BR /&gt;FROM task_weights tw&lt;BR /&gt;JOIN run_costs rc ON tw.job_id = rc.job_id AND tw.run_id = rc.run_id&lt;BR /&gt;JOIN task_tables tt ON tw.job_id = tt.job_id AND tw.run_id = tt.run_id AND tw.task_key = tt.task_key&lt;BR /&gt;JOIN table_counts tc ON tw.job_id = tc.job_id AND tw.run_id = tc.run_id AND tw.task_key = tc.task_key&lt;BR /&gt;LEFT JOIN system.lakeflow.jobs j ON tw.job_id = j.job_id&lt;BR /&gt;ORDER BY tw.job_id, tw.run_id, tt.table_name;&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Tue, 01 Sep 2026 09:28:28 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167107#M55639</guid>
      <dc:creator>bhawana-pandey</dc:creator>
      <dc:date>2026-09-01T09:28:28Z</dc:date>
    </item>
    <item>
      <title>Re: How to calculate cost of each table for the specific Databricks Run ID</title>
      <link>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167111#M55640</link>
      <description>&lt;P&gt;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/229992"&gt;@Dolly0503&lt;/a&gt;,&lt;/P&gt;&lt;P&gt;yes the idea is the same what &lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/78871"&gt;@bhawana-pandey&lt;/a&gt;&amp;nbsp;said.&lt;/P&gt;&lt;P&gt;if you need more accurate - use " (DESCRIBE HISTORY demo.sales.order_margin)" to get table size.&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;You can try to&lt;BR /&gt;1. from system.billing.usage and system.billing.list_prices price every JOBS usage -&amp;gt; take workspace_id + job_id + job_run_id&lt;BR /&gt;2. from system.lakeflow.job_task_run_timeline get active seconds per TASK within each run&lt;BR /&gt;3. Allocate run cost (#1) to tasks (#2) by duration share to cost per task&lt;BR /&gt;4. from system.access.table_lineage link tables to runs (entity_run_id is job_run_id)&lt;BR /&gt;5. split cost for each Run ID (#3) equally across the tables of that run (#4)&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;but that splits cost equally across the tables.&lt;BR /&gt;not sure how split more accurate.&lt;/P&gt;&lt;P&gt;As a start idea - use history information to find how big was the specific change:&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;SELECT&lt;BR /&gt;version,&lt;BR /&gt;timestamp,&lt;BR /&gt;operation,&lt;BR /&gt;operationMetrics['numOutputRows'] AS num_output_rows,&lt;BR /&gt;operationMetrics['numOutputBytes'] AS num_output_bytes,&lt;BR /&gt;operationMetrics['numFiles'] AS num_files&lt;BR /&gt;FROM (DESCRIBE HISTORY demo.sales.order_margin)&lt;BR /&gt;WHERE job.runId IS NOT NULL&lt;BR /&gt;AND operation IN ('WRITE','MERGE','CREATE TABLE AS SELECT','INSERT')&lt;/P&gt;</description>
      <pubDate>Tue, 01 Sep 2026 09:56:46 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167111#M55640</guid>
      <dc:creator>PuchninSergei</dc:creator>
      <dc:date>2026-09-01T09:56:46Z</dc:date>
    </item>
    <item>
      <title>Re: How to calculate cost of each table for the specific Databricks Run ID</title>
      <link>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167114#M55642</link>
      <description>&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;To&lt;/SPAN&gt;&lt;SPAN&gt; calculate &lt;/SPAN&gt;&lt;SPAN&gt;table&lt;/SPAN&gt;&lt;SPAN&gt;-&lt;/SPAN&gt;&lt;SPAN&gt;level&lt;/SPAN&gt;&lt;SPAN&gt; cost &lt;/SPAN&gt;&lt;SPAN&gt;for&lt;/SPAN&gt;&lt;SPAN&gt; each specific Job Run ID &lt;/SPAN&gt;&lt;SPAN&gt;in&lt;/SPAN&gt;&lt;SPAN&gt; Databricks, you must &lt;/SPAN&gt;&lt;SPAN&gt;join&lt;/SPAN&gt; &lt;SPAN&gt;system&lt;/SPAN&gt;&lt;SPAN&gt; billing logs &lt;/SPAN&gt;&lt;SPAN&gt;with&lt;/SPAN&gt;&lt;SPAN&gt; operational metadata.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;Databricks billing metrics (&lt;/SPAN&gt;&lt;SPAN&gt;system&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;billing&lt;/SPAN&gt;&lt;SPAN&gt;.usage) track cost down &lt;/SPAN&gt;&lt;SPAN&gt;to&lt;/SPAN&gt;&lt;SPAN&gt; the Task Run ID &lt;/SPAN&gt;&lt;SPAN&gt;level&lt;/SPAN&gt;&lt;SPAN&gt;, but Databricks does &lt;/SPAN&gt;&lt;SPAN&gt;not&lt;/SPAN&gt;&lt;SPAN&gt; track &lt;/SPAN&gt;&lt;SPAN&gt;table&lt;/SPAN&gt;&lt;SPAN&gt;-&lt;/SPAN&gt;&lt;SPAN&gt;level&lt;/SPAN&gt;&lt;SPAN&gt; cost natively inside billing logs, because a single Spark task &lt;/SPAN&gt;&lt;SPAN&gt;or&lt;/SPAN&gt;&lt;SPAN&gt; write operation might process multiple tables.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;To&lt;/SPAN&gt;&lt;SPAN&gt; achieve &lt;/SPAN&gt;&lt;SPAN&gt;100&lt;/SPAN&gt;&lt;SPAN&gt;% reconciliation (&lt;/SPAN&gt;&lt;SPAN&gt;where&lt;/SPAN&gt;&lt;SPAN&gt; the sum of &lt;/SPAN&gt;&lt;SPAN&gt;table&lt;/SPAN&gt;&lt;SPAN&gt; costs &lt;/SPAN&gt;&lt;SPAN&gt;for&lt;/SPAN&gt;&lt;SPAN&gt; a Run ID equals the actual Run ID billing cost &lt;/SPAN&gt;&lt;SPAN&gt;without&lt;/SPAN&gt;&lt;SPAN&gt; double counting &lt;/SPAN&gt;&lt;SPAN&gt;or&lt;/SPAN&gt;&lt;SPAN&gt; under counting), the recommended approach &lt;/SPAN&gt;&lt;SPAN&gt;is&lt;/SPAN&gt; &lt;SPAN&gt;to&lt;/SPAN&gt;&lt;SPAN&gt; allocate the Run ID&lt;/SPAN&gt;&lt;SPAN&gt;'s billed cost proportionally across the tables written during that specific run based on the bytes written or rows inserted.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;Core Logic &amp;amp; Architecture&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;1. &amp;nbsp;Billing Base: Join system.billing.usage with system.billing.list_prices to get the exact cost per job_run_id and task_id (custom_tags.ResourceClass or usage_metadata.job_run_id).&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;Query – &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;SELECT &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; u.usage_metadata.job_id AS job_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; u.usage_metadata.job_run_id AS run_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; u.usage_metadata.task_id AS task_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; u.account_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; u.cloud,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;SUM&lt;/SPAN&gt;&lt;SPAN&gt;(u.usage_quantity * &lt;/SPAN&gt;&lt;SPAN&gt;COALESCE&lt;/SPAN&gt;&lt;SPAN&gt;(p.pricing.default, 0)) AS task_run_cost&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; FROM system.billing.usage u&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; LEFT JOIN system.billing.list_prices p&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ON u.sku_name = p.sku_name&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AND u.usage_start_time &amp;gt;= p.price_start_time&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;AND &lt;/SPAN&gt;&lt;SPAN&gt;(p.price_end_time IS NULL OR u.usage_start_time &amp;lt; p.price_end_time)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; WHERE u.usage_metadata.job_run_id IS NOT NULL&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; GROUP BY ALL&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;2. &amp;nbsp;Table Operations (Delta Query Log): Query Delta Lake transaction history via system.access.audit or Delta table_history to identify which tables were modified by each job_run_id and the volume written (numOutputBytes / numOutputRows).&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;SELECT &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request_params.job_id AS job_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request_params.job_run_id AS run_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request_params.task_id AS task_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;CONCAT&lt;/SPAN&gt;&lt;SPAN&gt;(request_params.catalog_name, '&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;', request_params.schema_name, '&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;', request_params.table_name) AS table_name,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -- Fallback to 1 if output bytes are missing/zero to allow equal split&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;COALESCE&lt;/SPAN&gt;&lt;SPAN&gt;(CAST(response.result.numOutputBytes AS DOUBLE), 1.0) AS bytes_written&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; FROM system.access.audit&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; WHERE service_name = '&lt;/SPAN&gt;&lt;SPAN&gt;unityCatalog&lt;/SPAN&gt;&lt;SPAN&gt;'&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; AND action_name IN ('&lt;/SPAN&gt;&lt;SPAN&gt;createTable&lt;/SPAN&gt;&lt;SPAN&gt;', '&lt;/SPAN&gt;&lt;SPAN&gt;modifyTable&lt;/SPAN&gt;&lt;SPAN&gt;', '&lt;/SPAN&gt;&lt;SPAN&gt;writeTable&lt;/SPAN&gt;&lt;SPAN&gt;', '&lt;/SPAN&gt;&lt;SPAN&gt;deltaCommit&lt;/SPAN&gt;&lt;SPAN&gt;')&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; AND request_params.job_run_id IS NOT NULL&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;3. &amp;nbsp;Proportional Allocation: Distribute the task/run cost to each table using:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;SELECT &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; job_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; run_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; task_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; table_name,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bytes_written,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;SUM&lt;/SPAN&gt;&lt;SPAN&gt;(bytes_written) OVER (PARTITION BY job_id, run_id, task_id) AS total_task_bytes&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; FROM table_write_metrics&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;Final Query –&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;WITH job_run_costs AS (&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; -- Step 1: Calculate total cost per Job ID, Run ID, and Task ID from Billing Logs&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; SELECT &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; u.usage_metadata.job_id AS job_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; u.usage_metadata.job_run_id AS run_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; u.usage_metadata.task_id AS task_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; u.account_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; u.cloud,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;SUM&lt;/SPAN&gt;&lt;SPAN&gt;(u.usage_quantity * &lt;/SPAN&gt;&lt;SPAN&gt;COALESCE&lt;/SPAN&gt;&lt;SPAN&gt;(p.pricing.default, 0)) AS task_run_cost&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; FROM system.billing.usage u&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; LEFT JOIN system.billing.list_prices p&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ON u.sku_name = p.sku_name&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AND u.usage_start_time &amp;gt;= p.price_start_time&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;AND &lt;/SPAN&gt;&lt;SPAN&gt;(p.price_end_time IS NULL OR u.usage_start_time &amp;lt; p.price_end_time)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; WHERE u.usage_metadata.job_run_id IS NOT NULL&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; GROUP BY ALL&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;),&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;table_write_metrics AS (&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; -- Step 2: Extract table write activity per Job Run ID from System Audit Logs&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; SELECT &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request_params.job_id AS job_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request_params.job_run_id AS run_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; request_params.task_id AS task_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;CONCAT&lt;/SPAN&gt;&lt;SPAN&gt;(request_params.catalog_name, '&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;', request_params.schema_name, '&lt;/SPAN&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;SPAN&gt;', request_params.table_name) AS table_name,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -- Fallback to 1 if output bytes are missing/zero to allow equal split&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;COALESCE&lt;/SPAN&gt;&lt;SPAN&gt;(CAST(response.result.numOutputBytes AS DOUBLE), 1.0) AS bytes_written&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; FROM system.access.audit&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; WHERE service_name = '&lt;/SPAN&gt;&lt;SPAN&gt;unityCatalog&lt;/SPAN&gt;&lt;SPAN&gt;'&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; AND action_name IN ('&lt;/SPAN&gt;&lt;SPAN&gt;createTable&lt;/SPAN&gt;&lt;SPAN&gt;', '&lt;/SPAN&gt;&lt;SPAN&gt;modifyTable&lt;/SPAN&gt;&lt;SPAN&gt;', '&lt;/SPAN&gt;&lt;SPAN&gt;writeTable&lt;/SPAN&gt;&lt;SPAN&gt;', '&lt;/SPAN&gt;&lt;SPAN&gt;deltaCommit&lt;/SPAN&gt;&lt;SPAN&gt;')&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; AND request_params.job_run_id IS NOT NULL&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;),&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;task_table_totals AS (&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; -- Step 3: Compute total bytes written per Task Run ID for cost distribution&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; SELECT &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; job_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; run_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; task_id,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; table_name,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bytes_written,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;SUM&lt;/SPAN&gt;&lt;SPAN&gt;(bytes_written) OVER (PARTITION BY job_id, run_id, task_id) AS total_task_bytes&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; FROM table_write_metrics&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;-- Step 4: Proportional Allocation of Cost to Tables per Run ID&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;SELECT &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; c.job_id AS `Job ID`,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; c.run_id AS `Run ID`,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; c.task_id AS `Task`,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;COALESCE&lt;/SPAN&gt;&lt;SPAN&gt;(t.table_name, '&lt;/SPAN&gt;&lt;SPAN&gt;Non&lt;/SPAN&gt;&lt;SPAN&gt;-&lt;/SPAN&gt;&lt;SPAN&gt;Table&lt;/SPAN&gt; &lt;SPAN&gt;/&lt;/SPAN&gt;&lt;SPAN&gt; Overhead Compute&lt;/SPAN&gt;&lt;SPAN&gt;') AS `Table`,&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;ROUND&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c.task_run_cost * (&lt;/SPAN&gt;&lt;SPAN&gt;COALESCE&lt;/SPAN&gt;&lt;SPAN&gt;(t.bytes_written, 1.0) / &lt;/SPAN&gt;&lt;SPAN&gt;COALESCE&lt;/SPAN&gt;&lt;SPAN&gt;(t.total_task_bytes, 1.0)), &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; ) AS `Table Cost`&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;FROM job_run_costs c&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;LEFT JOIN task_table_totals t&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; ON c.job_id = t.job_id&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;AND c.run_id = t.run_id&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;AND c.task_id = t.task_id&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;ORDER BY c.job_id, c.run_id, c.task_id, `Table Cost` DESC;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Tue, 01 Sep 2026 10:21:30 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167114#M55642</guid>
      <dc:creator>Satyasai</dc:creator>
      <dc:date>2026-09-01T10:21:30Z</dc:date>
    </item>
    <item>
      <title>Re: How to calculate cost of each table for the specific Databricks Run ID</title>
      <link>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167145#M55648</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Hi Bhawana,&lt;/P&gt;&lt;P&gt;I tried to implement the code as shown below, but how can I validate whether it is returning the correct results? Also, we are planning to enable the Genie workspace — if someone provides a table name, it should return the table name, run ID, and average cost of that runs (&lt;BR /&gt;select job_id, day, sum(cost_consumed) as cost_val&lt;BR /&gt;from schemaname.tablename&lt;BR /&gt;group by job_id, day&lt;BR /&gt;),&lt;/P&gt;&lt;P&gt;-- job cte&lt;/P&gt;&lt;P&gt;base_data as (&lt;BR /&gt;select *,&lt;BR /&gt;setup_duration_seconds + execution_duration_seconds as total_run_duration,&lt;BR /&gt;to_date(period_start_time) as execution_date&lt;BR /&gt;from system.lakeflow.job_task_run_timeline&lt;BR /&gt;where workspace_id IN ('123456', '107893')&lt;BR /&gt;),&lt;/P&gt;&lt;P&gt;job_names as (&lt;BR /&gt;select job_id, name as job_name&lt;BR /&gt;from system.lakeflow.jobs&lt;BR /&gt;),&lt;/P&gt;&lt;P&gt;data as (&lt;BR /&gt;select&lt;BR /&gt;*,&lt;BR /&gt;avg(execution_duration_seconds) over (&lt;BR /&gt;partition by job_id, to_date(period_start_time), task_key&lt;BR /&gt;) as avg_task_exec_for_day,&lt;/P&gt;&lt;P&gt;avg(sum(execution_duration_seconds)) over (&lt;BR /&gt;partition by job_id, to_date(period_start_time), parent_run_id&lt;BR /&gt;) over (partition by job_id, to_date(period_start_time))&lt;BR /&gt;as avg_exec_for_day&lt;BR /&gt;from base_data&lt;BR /&gt;)&lt;/P&gt;&lt;P&gt;select distinct&lt;BR /&gt;d.job_id,&lt;BR /&gt;j.job_name,&lt;BR /&gt;d.execution_date,&lt;BR /&gt;d.task_key,&lt;BR /&gt;split_part(d.task_key, '-', 1) as ctlg,&lt;BR /&gt;split_part(d.task_key, '-', 2) as db_name,&lt;BR /&gt;split_part(d.task_key, '-', 3) as tbl_name,&lt;BR /&gt;d.avg_task_exec_for_day,&lt;BR /&gt;d.avg_exec_for_day,&lt;BR /&gt;round(d.avg_task_exec_for_day / d.avg_exec_for_day, 3) as task_lvls_weightage,&lt;BR /&gt;round(c.cost_val, 5) as job_lvl_cost_in_usd,&lt;BR /&gt;round(task_lvls_weightage * c.cost_val, 5) as task_lvl_cost_in_usd&lt;BR /&gt;from data d&lt;BR /&gt;left join cost_agg c on c.job_id = d.job_id and c.day = d.execution_date&lt;BR /&gt;left join job_names j on d.job_id = j.job_id&lt;BR /&gt;where d.job_id = 155301936099512&lt;BR /&gt;order by execution_date desc, task_lvls_weightage desc&lt;/P&gt;</description>
      <pubDate>Tue, 01 Sep 2026 13:11:52 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/how-to-calculate-cost-of-each-table-for-the-specific-databricks/m-p/167145#M55648</guid>
      <dc:creator>Dolly0503</dc:creator>
      <dc:date>2026-09-01T13:11:52Z</dc:date>
    </item>
  </channel>
</rss>

