<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devcafe.co.kr/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kokoksh</id>
	<title>데브카페 - 사용자 기여 [ko]</title>
	<link rel="self" type="application/atom+xml" href="https://devcafe.co.kr/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kokoksh"/>
	<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/Kokoksh"/>
	<updated>2026-05-17T12:07:51Z</updated>
	<subtitle>사용자 기여</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=BigQuery_AutoScaling_Usage_SQL&amp;diff=640</id>
		<title>BigQuery AutoScaling Usage SQL</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=BigQuery_AutoScaling_Usage_SQL&amp;diff=640"/>
		<updated>2024-10-22T08:34:48Z</updated>

		<summary type="html">&lt;p&gt;Kokoksh: 새 문서: * BigQuery Capacity 사용 시 AutoScaling 사용량에 대한 모니터링 SQL  * GCP Billing 기준 TimeZone인 PST(태평양 표준시) 기준으로 TimeZone을 사용 &amp;lt;pre&amp;gt; with DATE_BUCKET as (   select cal_date   FROM UNNEST(GENERATE_DATE_ARRAY(CAST(parse_date(&amp;#039;%Y%m%d&amp;#039;,&amp;#039;20240601&amp;#039;) as date), CAST(parse_date(&amp;#039;%Y%m%d&amp;#039;,&amp;#039;20241031&amp;#039;) as date), INTERVAL 1 DAY)) as cal_date ) , RESERVATION_CHANGES as (   select *   from (     SELECT datetime(change_timestamp, (&amp;#039;PST8PDT&amp;#039;)) change_ti...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* BigQuery Capacity 사용 시 AutoScaling 사용량에 대한 모니터링 SQL &lt;br /&gt;
* GCP Billing 기준 TimeZone인 PST(태평양 표준시) 기준으로 TimeZone을 사용&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
with DATE_BUCKET as (&lt;br /&gt;
  select cal_date&lt;br /&gt;
  FROM UNNEST(GENERATE_DATE_ARRAY(CAST(parse_date(&#039;%Y%m%d&#039;,&#039;20240601&#039;) as date), CAST(parse_date(&#039;%Y%m%d&#039;,&#039;20241031&#039;) as date), INTERVAL 1 DAY)) as cal_date&lt;br /&gt;
)&lt;br /&gt;
, RESERVATION_CHANGES as (&lt;br /&gt;
  select *&lt;br /&gt;
  from (&lt;br /&gt;
    SELECT datetime(change_timestamp, (&#039;PST8PDT&#039;)) change_timestamp_org,&lt;br /&gt;
           date(date_trunc(datetime(change_timestamp, (&#039;PST8PDT&#039;)), DAY)) as change_date,&lt;br /&gt;
           datetime(IFNULL(LAG(a.change_timestamp) OVER (ORDER BY a.change_timestamp DESC),CURRENT_TIMESTAMP()), (&#039;PST8PDT&#039;)) AS end_change_timestamp_org,&lt;br /&gt;
           date(datetime(IFNULL(LAG(a.change_timestamp) OVER (ORDER BY a.change_timestamp DESC),CURRENT_TIMESTAMP()), (&#039;PST8PDT&#039;))) AS end_change_date,&lt;br /&gt;
           project_id,&lt;br /&gt;
           reservation_name,&lt;br /&gt;
           ignore_idle_slots,&lt;br /&gt;
           action,&lt;br /&gt;
           slot_capacity,&lt;br /&gt;
           autoscale.current_slots,&lt;br /&gt;
           autoscale.max_slots,&lt;br /&gt;
           user_email,&lt;br /&gt;
           edition&lt;br /&gt;
    FROM `region-US`.INFORMATION_SCHEMA.RESERVATION_CHANGES a &lt;br /&gt;
  )&lt;br /&gt;
  where 1=1&lt;br /&gt;
  and action NOT IN (&#039;DELETE&#039;)&lt;br /&gt;
)&lt;br /&gt;
, DATE_BUCKET_RESERVATION_CHANGES as (&lt;br /&gt;
  select cal_date&lt;br /&gt;
        , case when cal_date &amp;gt; change_date then CAST(parse_timestamp(&#039;%Y-%m-%d %H:%M:%S&#039;, cal_date || &#039; 00:00:00&#039;) AS datetime)&lt;br /&gt;
               else change_timestamp_org&lt;br /&gt;
          end as change_timestamp_new&lt;br /&gt;
        , case when cal_date &amp;lt; end_change_date then CAST(parse_timestamp(&#039;%Y-%m-%d %H:%M:%S&#039;, date_add(cal_date, interval 1 day) || &#039; 00:00:00&#039;) AS datetime)&lt;br /&gt;
               else end_change_timestamp_org&lt;br /&gt;
          end as end_change_timestamp_new&lt;br /&gt;
        , R.project_id&lt;br /&gt;
        , R.reservation_name&lt;br /&gt;
        , R.ignore_idle_slots&lt;br /&gt;
        , R.action&lt;br /&gt;
        , R.slot_capacity&lt;br /&gt;
        , R.current_slots&lt;br /&gt;
        , R.max_slots&lt;br /&gt;
        , R.user_email&lt;br /&gt;
        , R.edition&lt;br /&gt;
  from DATE_BUCKET T&lt;br /&gt;
    join RESERVATION_CHANGES R&lt;br /&gt;
      on R.change_date &amp;lt;&amp;gt; R.end_change_date&lt;br /&gt;
     and cal_date &amp;gt;= R.change_date&lt;br /&gt;
     and cal_date &amp;lt;= R.end_change_date&lt;br /&gt;
  union all&lt;br /&gt;
  select cal_date&lt;br /&gt;
        , change_timestamp_org as change_timestamp_new&lt;br /&gt;
        , end_change_timestamp_org as end_change_timestamp_new&lt;br /&gt;
        , R.project_id&lt;br /&gt;
        , R.reservation_name&lt;br /&gt;
        , R.ignore_idle_slots&lt;br /&gt;
        , R.action&lt;br /&gt;
        , R.slot_capacity&lt;br /&gt;
        , R.current_slots&lt;br /&gt;
        , R.max_slots&lt;br /&gt;
        , R.user_email&lt;br /&gt;
        , R.edition&lt;br /&gt;
  from DATE_BUCKET T&lt;br /&gt;
    join RESERVATION_CHANGES R&lt;br /&gt;
      on R.change_date = R.end_change_date&lt;br /&gt;
     and cal_date = R.change_date&lt;br /&gt;
)&lt;br /&gt;
select change_timestamp_new&lt;br /&gt;
    , end_change_timestamp_new&lt;br /&gt;
    , TIMESTAMP_DIFF(end_change_timestamp_new,change_timestamp_new,SECOND) as diff&lt;br /&gt;
    , project_id&lt;br /&gt;
    , reservation_name&lt;br /&gt;
    , ignore_idle_slots&lt;br /&gt;
    , action&lt;br /&gt;
    , slot_capacity&lt;br /&gt;
    , current_slots&lt;br /&gt;
    , max_slots&lt;br /&gt;
    , user_email&lt;br /&gt;
   , edition&lt;br /&gt;
from DATE_BUCKET_RESERVATION_CHANGES&lt;br /&gt;
where 1=1&lt;br /&gt;
order by cal_date desc, change_timestamp_new desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kokoksh</name></author>
	</entry>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=BigQuery-LookerSutdio_Audit_Log_SQL&amp;diff=639</id>
		<title>BigQuery-LookerSutdio Audit Log SQL</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=BigQuery-LookerSutdio_Audit_Log_SQL&amp;diff=639"/>
		<updated>2024-10-22T08:19:52Z</updated>

		<summary type="html">&lt;p&gt;Kokoksh: 설명 수정&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* LookerStudio Pro 사용시 Audit Log To BigQuery Export 에서 Workspace 목록 추출&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  FORMAT_TIMESTAMP((&#039;%Y-%m-%d %H:%M:%S&#039;), TIMESTAMP_MICROS(log.time_usec), &#039;Asia/Seoul&#039;) AS inq_dttm,&lt;br /&gt;
  gwslog.event_name,&lt;br /&gt;
  gwslog.email,&lt;br /&gt;
  gwslog.event_type,&lt;br /&gt;
  gwslog.data_studio.asset_id,&lt;br /&gt;
  gwslog.data_studio.asset_name,&lt;br /&gt;
  gwslog.data_studio.parent_workspace_id,&lt;br /&gt;
  rs.asset_name latest_asset_name,&lt;br /&gt;
  gwslog.data_studio.owner_email,&lt;br /&gt;
  gwslog.data_studio.visibility,&lt;br /&gt;
  rs.owner_email latest_owner_email,&lt;br /&gt;
  rs.visibility latest_visibility,&lt;br /&gt;
  rs.parent_workspace_id latest_parent_workspace_id&lt;br /&gt;
FROM&lt;br /&gt;
  `[Project_ID].[DataSet].activity` gwslog &lt;br /&gt;
LEFT JOIN ( -- 가장 최근에 변경된 보고서명을 가져오기 위한 서브쿼리 조인&lt;br /&gt;
  SELECT&lt;br /&gt;
    data_studio.asset_id,&lt;br /&gt;
    data_studio.asset_name,&lt;br /&gt;
    data_studio.visibility,&lt;br /&gt;
    data_studio.owner_email,&lt;br /&gt;
    data_studio.parent_workspace_id,&lt;br /&gt;
    ROW_NUMBER() OVER (PARTITION BY data_studio.asset_id ORDER BY time_usec DESC) AS rn&lt;br /&gt;
  FROM&lt;br /&gt;
    `[Project_ID].[DataSet].activity`&lt;br /&gt;
  WHERE&lt;br /&gt;
    record_type =&#039;data_studio&#039;&lt;br /&gt;
    AND data_studio.asset_type=&#039;WORKSPACE&#039;&lt;br /&gt;
  QUALIFY&lt;br /&gt;
    rn=1 ) rs &lt;br /&gt;
ON&lt;br /&gt;
  gwslog.data_studio.asset_id = rs.asset_id&lt;br /&gt;
WHERE&lt;br /&gt;
  gwslog.record_type = &#039;data_studio&#039;&lt;br /&gt;
  AND event_name=&#039;CREATE&#039; -- 생성보고서 기준으로 필터링 조건&lt;br /&gt;
  AND data_studio.asset_type=&#039;WORKSPACE&#039; -- LookerStudio Pro에서 Workspace 생성 목록 필터링 조건 &lt;br /&gt;
  AND NOT EXISTS ( -- 현재 삭제된 Workspace는 제외&lt;br /&gt;
  SELECT&lt;br /&gt;
    x.data_studio.asset_id&lt;br /&gt;
  FROM&lt;br /&gt;
    `[Project_ID].[DataSet].activity` x&lt;br /&gt;
  WHERE&lt;br /&gt;
    1=1&lt;br /&gt;
    AND event_name=&#039;TRASH&#039; -- LookerStudio Pro에서 삭제된 리스트 필터링 조건&lt;br /&gt;
    AND x.data_studio.asset_id = gwslog.data_studio.asset_id&lt;br /&gt;
    AND data_studio.asset_type=&#039;WORKSPACE&#039;&lt;br /&gt;
    AND x.data_studio.asset_id = gwslog.data_studio.asset_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kokoksh</name></author>
	</entry>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=BigQuery-LookerSutdio_Audit_Log_SQL&amp;diff=638</id>
		<title>BigQuery-LookerSutdio Audit Log SQL</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=BigQuery-LookerSutdio_Audit_Log_SQL&amp;diff=638"/>
		<updated>2024-10-22T08:17:27Z</updated>

		<summary type="html">&lt;p&gt;Kokoksh: 새 문서: * LookerStudio Audit Log를 위해 BigQuery Export 시 Workspace 목록 추출  &amp;lt;pre&amp;gt; SELECT   FORMAT_TIMESTAMP((&amp;#039;%Y-%m-%d %H:%M:%S&amp;#039;), TIMESTAMP_MICROS(log.time_usec), &amp;#039;Asia/Seoul&amp;#039;) AS inq_dttm,   gwslog.event_name,   gwslog.email,   gwslog.event_type,   gwslog.data_studio.asset_id,   gwslog.data_studio.asset_name,   gwslog.data_studio.parent_workspace_id,   rs.asset_name latest_asset_name,   gwslog.data_studio.owner_email,   gwslog.data_studio.visibility,   rs.owner_email lates...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* LookerStudio Audit Log를 위해 BigQuery Export 시 Workspace 목록 추출&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  FORMAT_TIMESTAMP((&#039;%Y-%m-%d %H:%M:%S&#039;), TIMESTAMP_MICROS(log.time_usec), &#039;Asia/Seoul&#039;) AS inq_dttm,&lt;br /&gt;
  gwslog.event_name,&lt;br /&gt;
  gwslog.email,&lt;br /&gt;
  gwslog.event_type,&lt;br /&gt;
  gwslog.data_studio.asset_id,&lt;br /&gt;
  gwslog.data_studio.asset_name,&lt;br /&gt;
  gwslog.data_studio.parent_workspace_id,&lt;br /&gt;
  rs.asset_name latest_asset_name,&lt;br /&gt;
  gwslog.data_studio.owner_email,&lt;br /&gt;
  gwslog.data_studio.visibility,&lt;br /&gt;
  rs.owner_email latest_owner_email,&lt;br /&gt;
  rs.visibility latest_visibility,&lt;br /&gt;
  rs.parent_workspace_id latest_parent_workspace_id&lt;br /&gt;
FROM&lt;br /&gt;
  `[Project_ID].[DataSet].activity` gwslog &lt;br /&gt;
LEFT JOIN ( -- 가장 최근에 변경된 보고서명을 가져오기 위한 서브쿼리 조인&lt;br /&gt;
  SELECT&lt;br /&gt;
    data_studio.asset_id,&lt;br /&gt;
    data_studio.asset_name,&lt;br /&gt;
    data_studio.visibility,&lt;br /&gt;
    data_studio.owner_email,&lt;br /&gt;
    data_studio.parent_workspace_id,&lt;br /&gt;
    ROW_NUMBER() OVER (PARTITION BY data_studio.asset_id ORDER BY time_usec DESC) AS rn&lt;br /&gt;
  FROM&lt;br /&gt;
    `[Project_ID].[DataSet].activity`&lt;br /&gt;
  WHERE&lt;br /&gt;
    record_type =&#039;data_studio&#039;&lt;br /&gt;
    AND data_studio.asset_type=&#039;WORKSPACE&#039;&lt;br /&gt;
  QUALIFY&lt;br /&gt;
    rn=1 ) rs &lt;br /&gt;
ON&lt;br /&gt;
  gwslog.data_studio.asset_id = rs.asset_id&lt;br /&gt;
WHERE&lt;br /&gt;
  gwslog.record_type = &#039;data_studio&#039;&lt;br /&gt;
  AND event_name=&#039;CREATE&#039; -- 생성보고서 기준으로 필터링 조건&lt;br /&gt;
  AND data_studio.asset_type=&#039;WORKSPACE&#039; -- LookerStudio Pro에서 Workspace 생성 목록 필터링 조건 &lt;br /&gt;
  AND NOT EXISTS ( -- 현재 삭제된 Workspace는 제외&lt;br /&gt;
  SELECT&lt;br /&gt;
    x.data_studio.asset_id&lt;br /&gt;
  FROM&lt;br /&gt;
    `[Project_ID].[DataSet].activity` x&lt;br /&gt;
  WHERE&lt;br /&gt;
    1=1&lt;br /&gt;
    AND event_name=&#039;TRASH&#039; -- LookerStudio Pro에서 삭제된 리스트 필터링 조건&lt;br /&gt;
    AND x.data_studio.asset_id = gwslog.data_studio.asset_id&lt;br /&gt;
    AND data_studio.asset_type=&#039;WORKSPACE&#039;&lt;br /&gt;
    AND x.data_studio.asset_id = gwslog.data_studio.asset_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kokoksh</name></author>
	</entry>
</feed>