<?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: Query to calculate cost of task from each job by day in Data Engineering</title>
    <link>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/135139#M50283</link>
    <description>&lt;P&gt;Can you explain more the nature of the duplicates you are getting?&lt;/P&gt;</description>
    <pubDate>Thu, 16 Oct 2025 14:40:24 GMT</pubDate>
    <dc:creator>LynDCode</dc:creator>
    <dc:date>2025-10-16T14:40:24Z</dc:date>
    <item>
      <title>Query to calculate cost of task from each job by day</title>
      <link>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/135120#M50281</link>
      <description>&lt;P&gt;I am trying to find the cost per Task in each Job every time it was executed (daily) but currently getting very huge numbers due to duplicates, can someone help me ?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="python"&gt;WITH workspace AS (
  SELECT
    account_id,
    workspace_id,
    workspace_name,
    workspace_url,
    status,
    workspace_name
  FROM system.access.workspaces_latest
),
usage_with_ws_filtered_by_date AS (
  SELECT
    u.*,
    w.workspace_name,
    w.workspace_url,
    w.workspace_full_name
  FROM system.billing.usage u
  INNER JOIN workspace w ON u.workspace_id = w.workspace_id
  WHERE u.billing_origin_product = 'JOBS'
    AND u.usage_date BETWEEN DATE_ADD(CURRENT_DATE(), -30) AND CURRENT_DATE()
),
task_usage AS (
  SELECT
    u.workspace_id,
    u.workspace_name,
    u.workspace_url,
    u.workspace_full_name,
    u.usage_metadata.job_id,
    u.usage_metadata.job_run_id AS run_id,
    t.task_key,
    t.change_time AS task_change_time,
    u.usage_start_time,
    u.usage_end_time,
    u.usage_quantity,
    u.sku_name,
    u.identity_metadata.run_as AS user,
    u.usage_date
  FROM usage_with_ws_filtered_by_date u
  INNER JOIN system.lakeflow.job_tasks t
    ON u.workspace_id = t.workspace_id
    AND u.usage_metadata.job_id = t.job_id
),
task_costs AS (
  SELECT
    tu.*,
    lp.pricing.default AS unit_price,
    tu.usage_quantity * lp.pricing.default AS cost
  FROM task_usage tu
  LEFT JOIN system.billing.list_prices lp
    ON tu.sku_name = lp.sku_name
    AND tu.usage_start_time &amp;gt;= lp.price_start_time
    AND (tu.usage_end_time &amp;lt;= lp.price_end_time OR lp.price_end_time IS NULL)
    AND lp.currency_code = 'USD'
)
SELECT
  tc.workspace_id,
  tc.workspace_name,
  tc.workspace_url,
  tc.user,
  tc.job_id,
  tc.run_id,
  tc.task_key,
  tc.task_change_time,
  tc.usage_start_time,
  tc.usage_end_time,
  tc.usage_date,
  SUM(tc.cost) AS total_cost
FROM task_costs tc
GROUP BY
  tc.workspace_id, tc.workspace_name, tc.workspace_url, tc.user, tc.job_id, tc.run_id,
  tc.task_key, tc.task_change_time, tc.usage_start_time, tc.usage_end_time, tc.usage_date
ORDER BY
  tc.usage_date DESC, tc.workspace_id, tc.job_id, tc.run_id, tc.task_key
 &lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 16 Oct 2025 13:25:54 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/135120#M50281</guid>
      <dc:creator>dndeng</dc:creator>
      <dc:date>2025-10-16T13:25:54Z</dc:date>
    </item>
    <item>
      <title>Re: Query to calculate cost of task from each job by day</title>
      <link>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/135139#M50283</link>
      <description>&lt;P&gt;Can you explain more the nature of the duplicates you are getting?&lt;/P&gt;</description>
      <pubDate>Thu, 16 Oct 2025 14:40:24 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/135139#M50283</guid>
      <dc:creator>LynDCode</dc:creator>
      <dc:date>2025-10-16T14:40:24Z</dc:date>
    </item>
    <item>
      <title>Re: Query to calculate cost of task from each job by day</title>
      <link>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/135141#M50284</link>
      <description>&lt;P&gt;It seems the duplicates are caused by the task_change_time from the job_tasks table. Even though the table definition shows&amp;nbsp;task_change_time is the time last time the task was modifed.. But it is capturing different times and it is SCD type 2 table. I updated the query. Can you please use this query. probably you can raise a Databricks ticket to see the reason to different&amp;nbsp; task_change_time eventhough the task is not updated.&lt;/P&gt;&lt;LI-CODE lang="python"&gt;WITH workspace AS (
  SELECT
    account_id,
    workspace_id,
    workspace_name,
    workspace_url,
    status,
    workspace_name
  FROM system.access.workspaces_latest
),
usage_with_ws_filtered_by_date AS (
  SELECT
    u.*,
    w.workspace_name,
    w.workspace_url
  FROM system.billing.usage u
  INNER JOIN workspace w ON u.workspace_id = w.workspace_id
  WHERE u.billing_origin_product = 'JOBS'
    AND u.usage_date BETWEEN DATE_ADD(CURRENT_DATE(), -30) AND CURRENT_DATE()
),
task_usage AS (
  SELECT
    u.workspace_id,
    u.workspace_name,
    u.workspace_url,
    u.usage_metadata.job_id,
    u.usage_metadata.job_run_id AS run_id,
    t.task_key,
    t.change_time AS task_change_time,
    u.usage_start_time,
    u.usage_end_time,
    u.usage_quantity,
    u.sku_name,
    u.identity_metadata.run_as AS user,
    u.usage_date
  FROM usage_with_ws_filtered_by_date u
  INNER JOIN system.lakeflow.job_tasks t
    ON u.workspace_id = t.workspace_id
    AND u.usage_metadata.job_id = t.job_id
),
task_costs AS (
  SELECT
    tu.*,
    lp.pricing.default AS unit_price,
    tu.usage_quantity * lp.pricing.default AS cost
  FROM task_usage tu
  LEFT JOIN system.billing.list_prices lp
    ON tu.sku_name = lp.sku_name
    AND tu.usage_start_time &amp;gt;= lp.price_start_time
    AND (tu.usage_end_time &amp;lt;= lp.price_end_time OR lp.price_end_time IS NULL)
    AND lp.currency_code = 'USD'
)
SELECT DISTINCT
  tc.workspace_id,
  tc.workspace_name,
  tc.workspace_url,
  tc.user,
  tc.job_id,
  tc.run_id,
  tc.task_key,
  tc.usage_start_time,
  tc.usage_end_time,
  tc.usage_date,
  SUM(tc.cost) AS total_cost
FROM task_costs tc
GROUP BY
  tc.workspace_id, tc.workspace_name, tc.workspace_url, tc.user, tc.job_id, tc.run_id,
  tc.task_key, tc.usage_start_time, tc.usage_end_time, tc.usage_date
ORDER BY
  tc.usage_date DESC, tc.workspace_id, tc.job_id, tc.run_id, tc.task_key&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 16 Oct 2025 14:58:59 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/135141#M50284</guid>
      <dc:creator>nayan_wylde</dc:creator>
      <dc:date>2025-10-16T14:58:59Z</dc:date>
    </item>
    <item>
      <title>Re: Query to calculate cost of task from each job by day</title>
      <link>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/135926#M50465</link>
      <description>&lt;P&gt;still costs exploded it seems there is no way to get cost per task only per job.&lt;/P&gt;</description>
      <pubDate>Fri, 24 Oct 2025 08:02:26 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/135926#M50465</guid>
      <dc:creator>dndeng</dc:creator>
      <dc:date>2025-10-24T08:02:26Z</dc:date>
    </item>
    <item>
      <title>Re: Query to calculate cost of task from each job by day</title>
      <link>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/138570#M50967</link>
      <description>&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;You are seeing inflated cost numbers because your query groups by many columns—especially&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;run_id&lt;/CODE&gt;,&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;task_key&lt;/CODE&gt;,&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;usage_start_time&lt;/CODE&gt;, and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;usage_end_time&lt;/CODE&gt;—without addressing possible duplicate row entries that arise from your joins, especially with the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;system.lakeflow.job_tasks&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;system.billing.usage&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;tables. This can lead to double-counting usage or cost data for the same task execution.&lt;/P&gt;
&lt;H2 id="key-issues" class="mb-2 mt-4 font-display font-semimedium text-base first:mt-0 md:text-lg [hr+&amp;amp;]:mt-4"&gt;Key Issues&lt;/H2&gt;
&lt;UL class="marker:text-quiet list-disc"&gt;
&lt;LI class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;STRONG&gt;Duplicate task-cost entries:&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;If&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;system.billing.usage&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;or&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;system.lakeflow.job_tasks&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;records have multiple rows per task execution (for example, due to granular SKU or pricing variations, or logs with multiple SKUs per run),&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;SUM(tc.cost)&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;aggregates duplicates rather than computing the true cost per task per job per day.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;STRONG&gt;Grouping by too many detail columns:&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Including both&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;run_id&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and precise timing blocks the aggregation at the desired daily level.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="recommended-fix" class="mb-2 mt-4 font-display font-semimedium text-base first:mt-0 md:text-lg [hr+&amp;amp;]:mt-4"&gt;Recommended Fix&lt;/H2&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;To compute daily&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM&gt;unique&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;cost per task per job, perform aggregation at the correct level (task, job, day) and deduplicate usage with a window or distinct operation.&lt;/P&gt;
&lt;H2 class="mb-2 mt-4 font-display font-semimedium text-base first:mt-0"&gt;Example Solution&lt;/H2&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;Below is a refactored query that:&lt;/P&gt;
&lt;UL class="marker:text-quiet list-disc"&gt;
&lt;LI class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;STRONG&gt;Deduplicates&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;task usage per workspace, job, run, task, and day.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;STRONG&gt;Aggregates&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;cost per unique task execution per day.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;DIV class="w-full md:max-w-[90vw]"&gt;
&lt;DIV class="codeWrapper text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded font-mono text-sm font-normal bg-subtler"&gt;
&lt;DIV class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end md:sticky md:top-[100px]"&gt;
&lt;DIV class="overflow-hidden rounded-full border-subtlest ring-subtlest divide-subtlest bg-base"&gt;
&lt;DIV class="border-subtlest ring-subtlest divide-subtlest bg-subtler"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="-mt-xl"&gt;
&lt;DIV&gt;
&lt;DIV class="text-quiet bg-subtle py-xs px-sm inline-block rounded-br rounded-tl-[3px] font-thin" data-testid="code-language-indicator"&gt;sql&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;CODE&gt;&lt;SPAN class="token token"&gt;WITH&lt;/SPAN&gt; workspace &lt;SPAN class="token token"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="token token punctuation"&gt;(&lt;/SPAN&gt;
  &lt;SPAN class="token token"&gt;SELECT&lt;/SPAN&gt; account_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; workspace_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; workspace_name&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; workspace_url&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;status&lt;/SPAN&gt;
  &lt;SPAN class="token token"&gt;FROM&lt;/SPAN&gt; system&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;access&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;workspaces_latest
&lt;SPAN class="token token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
usage_with_ws_filtered_by_date &lt;SPAN class="token token"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="token token punctuation"&gt;(&lt;/SPAN&gt;
  &lt;SPAN class="token token"&gt;SELECT&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token token operator"&gt;*&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    w&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;workspace_name&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    w&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;workspace_url
  &lt;SPAN class="token token"&gt;FROM&lt;/SPAN&gt; system&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;billing&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token token"&gt;usage&lt;/SPAN&gt; u
  &lt;SPAN class="token token"&gt;INNER&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;JOIN&lt;/SPAN&gt; workspace w &lt;SPAN class="token token"&gt;ON&lt;/SPAN&gt; u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;workspace_id &lt;SPAN class="token token operator"&gt;=&lt;/SPAN&gt; w&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;workspace_id
  &lt;SPAN class="token token"&gt;WHERE&lt;/SPAN&gt; u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;billing_origin_product &lt;SPAN class="token token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;'JOBS'&lt;/SPAN&gt;
    &lt;SPAN class="token token operator"&gt;AND&lt;/SPAN&gt; u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_date &lt;SPAN class="token token operator"&gt;BETWEEN&lt;/SPAN&gt; DATE_ADD&lt;SPAN class="token token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token token"&gt;CURRENT_DATE&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token token operator"&gt;-&lt;/SPAN&gt;&lt;SPAN class="token token"&gt;30&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;)&lt;/SPAN&gt; &lt;SPAN class="token token operator"&gt;AND&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;CURRENT_DATE&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
task_usage &lt;SPAN class="token token"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="token token punctuation"&gt;(&lt;/SPAN&gt;
  &lt;SPAN class="token token"&gt;SELECT&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;workspace_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;workspace_name&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;workspace_url&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_metadata&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;job_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_metadata&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;job_run_id &lt;SPAN class="token token"&gt;AS&lt;/SPAN&gt; run_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    t&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;task_key&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_start_time&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_end_time&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_quantity&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;sku_name&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;identity_metadata&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;run_as &lt;SPAN class="token token"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;user&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_date
  &lt;SPAN class="token token"&gt;FROM&lt;/SPAN&gt; usage_with_ws_filtered_by_date u
  &lt;SPAN class="token token"&gt;INNER&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;JOIN&lt;/SPAN&gt; system&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;lakeflow&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;job_tasks t
    &lt;SPAN class="token token"&gt;ON&lt;/SPAN&gt; u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;workspace_id &lt;SPAN class="token token operator"&gt;=&lt;/SPAN&gt; t&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;workspace_id
    &lt;SPAN class="token token operator"&gt;AND&lt;/SPAN&gt; u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_metadata&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;job_id &lt;SPAN class="token token operator"&gt;=&lt;/SPAN&gt; t&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;job_id
    &lt;SPAN class="token token operator"&gt;AND&lt;/SPAN&gt; u&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_metadata&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;job_run_id &lt;SPAN class="token token operator"&gt;=&lt;/SPAN&gt; t&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;job_run_id  &lt;SPAN class="token token"&gt;-- Ensures exact match per run&lt;/SPAN&gt;
&lt;SPAN class="token token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
task_costs &lt;SPAN class="token token"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="token token punctuation"&gt;(&lt;/SPAN&gt;
  &lt;SPAN class="token token"&gt;SELECT&lt;/SPAN&gt;
    tu&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token token operator"&gt;*&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    lp&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;pricing&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token token"&gt;default&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;AS&lt;/SPAN&gt; unit_price&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    tu&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_quantity &lt;SPAN class="token token operator"&gt;*&lt;/SPAN&gt; lp&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;pricing&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token token"&gt;default&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;AS&lt;/SPAN&gt; cost
  &lt;SPAN class="token token"&gt;FROM&lt;/SPAN&gt; task_usage tu
  &lt;SPAN class="token token"&gt;LEFT&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;JOIN&lt;/SPAN&gt; system&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;billing&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;list_prices lp
    &lt;SPAN class="token token"&gt;ON&lt;/SPAN&gt; tu&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;sku_name &lt;SPAN class="token token operator"&gt;=&lt;/SPAN&gt; lp&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;sku_name
    &lt;SPAN class="token token operator"&gt;AND&lt;/SPAN&gt; tu&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_start_time &lt;SPAN class="token token operator"&gt;&amp;gt;=&lt;/SPAN&gt; lp&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;price_start_time
    &lt;SPAN class="token token operator"&gt;AND&lt;/SPAN&gt; &lt;SPAN class="token token punctuation"&gt;(&lt;/SPAN&gt;tu&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;usage_end_time &lt;SPAN class="token token operator"&gt;&amp;lt;=&lt;/SPAN&gt; lp&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;price_end_time &lt;SPAN class="token token operator"&gt;OR&lt;/SPAN&gt; lp&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;price_end_time &lt;SPAN class="token token operator"&gt;IS&lt;/SPAN&gt; &lt;SPAN class="token token boolean"&gt;NULL&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;)&lt;/SPAN&gt;
    &lt;SPAN class="token token operator"&gt;AND&lt;/SPAN&gt; lp&lt;SPAN class="token token punctuation"&gt;.&lt;/SPAN&gt;currency_code &lt;SPAN class="token token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;'USD'&lt;/SPAN&gt;
&lt;SPAN class="token token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
deduped_task_costs &lt;SPAN class="token token"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="token token punctuation"&gt;(&lt;/SPAN&gt;
  &lt;SPAN class="token token"&gt;SELECT&lt;/SPAN&gt;
    workspace_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    workspace_name&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    workspace_url&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    &lt;SPAN class="token token"&gt;user&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    job_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    run_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    task_key&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    usage_date&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt;
    &lt;SPAN class="token token"&gt;SUM&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;(&lt;/SPAN&gt;cost&lt;SPAN class="token token punctuation"&gt;)&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;AS&lt;/SPAN&gt; daily_task_cost
  &lt;SPAN class="token token"&gt;FROM&lt;/SPAN&gt; task_costs
  &lt;SPAN class="token token"&gt;GROUP&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;BY&lt;/SPAN&gt;
    workspace_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; workspace_name&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; workspace_url&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;user&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; job_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; run_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; task_key&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; usage_date
&lt;SPAN class="token token punctuation"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="token token"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="token token operator"&gt;*&lt;/SPAN&gt;
&lt;SPAN class="token token"&gt;FROM&lt;/SPAN&gt; deduped_task_costs
&lt;SPAN class="token token"&gt;ORDER&lt;/SPAN&gt; &lt;SPAN class="token token"&gt;BY&lt;/SPAN&gt; usage_date &lt;SPAN class="token token"&gt;DESC&lt;/SPAN&gt;&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; workspace_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; job_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; run_id&lt;SPAN class="token token punctuation"&gt;,&lt;/SPAN&gt; task_key&lt;SPAN class="token token punctuation"&gt;;&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;STRONG&gt;Key changes:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL class="marker:text-quiet list-disc"&gt;
&lt;LI class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;The final grouping is at the [workspace, job, run, task, day] level.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;No grouping by highly granular fields (e.g., usage_start_time) that cause duplicates.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;Adds a join condition on&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;job_run_id&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;that helps deduplicate runs.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="next-steps" class="mb-2 mt-4 font-display font-semimedium text-base first:mt-0 md:text-lg [hr+&amp;amp;]:mt-4"&gt;Next Steps&lt;/H2&gt;
&lt;UL class="marker:text-quiet list-disc"&gt;
&lt;LI class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;If you still see large cost numbers, check your raw data for duplicates (multiple usage SKUs for one task/run).&lt;/P&gt;
&lt;/LI&gt;
&lt;LI class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;If necessary, aggregate at a higher level—such as per task per job per workspace per day (without grouping by run_id)—if each run represents duplicate usage for the same logical task.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;You may need to adjust the grouping to your real business definition of “cost per Task in each Job every time it was executed (daily),” depending on how you want to attribute runs and reruns. Let this structure be your base to tune further.&lt;/P&gt;</description>
      <pubDate>Tue, 11 Nov 2025 10:53:39 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/query-to-calculate-cost-of-task-from-each-job-by-day/m-p/138570#M50967</guid>
      <dc:creator>mark_ott</dc:creator>
      <dc:date>2025-11-11T10:53:39Z</dc:date>
    </item>
  </channel>
</rss>

