utc時間怎麼算 報表自動化 抓住時間流逝的瞬間

2021-10-11 23:48:14 字數 3576 閱讀 6299

報表自動化: 抓住時間流逝的瞬間​www.coologic.cn

前面《報表自動化: 沒有壓力的維度建模》以超市的乙個訂單為例簡單講述了維度建模中事實表與維度表的概念,這一篇主要講一講維度裡面的時間維度這個特殊的資料內容。

為什麼說時間維度特殊呢?比如說商品的分類:蔬菜、水果、飲品、小家電……很多種分類,但這個分類的數量有限且不是很多,但是對於時間呢,每一時間點都是乙個值。

有人說既然時間這麼多那不當做維度表處理不就行了麼?但是我們的各種統計往往會根據時間作為判斷依據,比如當日營業額,同比增長率……那麼我們該如何處理呢?

首先我們要確定我們需要的最小粒度的時間,這裡我們期待找到業務記錄的精確到秒、毫秒級別以上的乙個時間,這一步我們需要根據我們未來的報表需要進行處理。

比如我們的業務只需要分析每日資訊,那麼我們只需要以日期作為最小粒度的緯度值。這樣我們的日期作為最小粒度的維度表中,每天都有一行資料,儲存著一天的維度型別。

如果我們需要區分上午來訪人數與下午來訪人數的比較,那麼我們的維度可能需要精確到上午下午,這時候也許還需要個晚上?這樣一天就需要拆分為三個型別,每天都有三行資料。

那麼我們的維度表儲存什麼呢?讓我們來看乙個以日期為最小粒度的簡易維度表dim_date_time_utc8

通過上面的維度表,我們可以快速的將資料庫裡的utc時間轉換為utc+8時區的日期,快速生成可供後端直接讀取顯示的報表資料,同樣的我們也可以建立多個不同時區的維度,以快速的算的多時區的日期。

注意一下,這個維度表可以儲存過程一次生成的,但是我們不要生成從宇宙創立之初到一千年以後的維度,可以根據資料的需要進行生成,比如報表只需要顯示最近兩年的情況,那麼我們只需要生成最近兩年的緯度值,這樣在進行資料庫處理分析的時候能降低資料量並通過這個時間維度表來過濾掉時間範圍以外的資料。

讓我們高階一下,上午下午晚上這種粒度的時間維度該怎麼做呢?讓我們那建立以時間段為最小粒度的時間維度表dim_date_time_segment_utc8

起止時間我就亂改了,這時候還需要第二個維度表了,把「時間段」的維度寫出來dim_time_segment_status_utc8

前面提到我們要找到最小粒度的時間,那麼我們還需要大力度的時間該怎麼辦呢?比如還需要月度的統計、季度的統計呢?

我們有兩種方式,第一種方式將耦合度提高,降低運算過程連表的數量,不用過多的介紹直接上表結構示意:

想一想漫長的日子,就讓我們每天 = 渡過三個月吧
另一種解耦的方法就是時間表不變,我們把utc+8日期、年份、月度、季度這三個字段單獨作為乙個表。

只看到了一堆的 table,讓我們來看一下如何使用,上最喜歡的 code

select dim_invoied_date_time.utc_cn_date as invoiced_date,

dim_invoiced_date_year_month.month as invoiced_month,

dim_invoiced_date_year_month.quarter as invoiced_quarter

from supermarket_sales_order as sales_order

join dim_date_time_utc8 as dim_invoied_date_time

on sales_order.invoiced_time >= date_time.from_time

and sales_order.invoiced_time < date_time.end_time

join dim_date_year_month as dim_invoiced_date_year_month

on dim_invoied_date_time.utc_cn_date = dim_date_year_month.utc_cn_date

由於表裡涉及的是起止時間有重疊,所以**裡一定要注意大於等於、小於

不建議使用 between,一定要明確當前資料庫中 between 對邊界的處理,如果使用 between,需要注意避免在遷移資料庫中對臨界值的資料進行考慮

我們的報表往往不止需要關注當前業務的各種資訊的最終狀態,我們還需要回顧以前的種種。

繼續拿超市的訂單來舉例,乙個訂單有已建立、已付款、已兌換、已退款……有多種狀態的變化,如果我們業務資料庫中記錄下了每一次變化的時間點,比如我們有這樣的乙個表:

這個使用者好像很猶豫呀,一天做一步
如果業務只記錄了這樣的表結構,那麼我們該如何在報表中應用呢?難道我們每次都要來這裡搜尋乙個訂單的在這裡儲存的最大時間值來獲取當前狀態,通過找到乙個訂單緊鄰的兩個狀態條目的時間來計算「付款猶豫期」?

對於這種乙個物體會在多個時間點進行狀態變化的問題,為了方便快速的做各種分析,包括:當前狀態狀態的持續時間某一時間點的狀態,我們引入緩慢變化維(slowly changing dimension)來解決這類問題。

對於scd我們有三種處理方式:

來乙個起止時間的例子:

對於 end_time 也可以是下一次的 start_time,保持風格一致即可,因為會影響到處理邏輯的區間邊界問題
通過 join 這種時間維度進行時區轉換

通過 sql 的時間計算函式通過 view 或者 etl 工具讀取資料時進行轉換

通過 etl 工具內的時間計算功能的進行時間計算

利用Python實現報表自動化

匯入源資料 import pandas as pd from datetime import datetime data pd.read csv r users faye desktop order 14.1.csv parse dates 成交時間 parse dates將資料解析為時間格式 da...

怎麼做自動化測試

目錄 自動化測試細分 介面自動化設計過程 效能自動化設計過程 效能瓶頸及調優參考鏈結 大致分為功能自動化測試 效能自動化測試,其中功能自動化可分為ui自動化 介面自動化。ui自動化 如果頁面改動較頻繁,開發和維護ui自動化用例就顯得耗時耗力,所以適合在系統非常穩定的時候對主流程頁面做ui回歸測試。介...

報表自動化 商業智慧型背後的秘密

首先先說說商業智慧型與報表自動化。報表自動化呢?是指將傳統的人工整理報表 excel 的過程實現自動化,比如統計出當月銷售總額,自動化的報表可以自動根據當月的所有銷售訂單記錄自行計算出這個當月銷售總額資訊,而不需要像傳統方式手動整理 統計資料。商業智慧型 報表自動化,可以說報表自動化是商業智慧型的乙...