垃圾維度:它是什麼以及為什麼它不是垃圾

垃圾維度:它是什麼以及為什麼它不是垃圾

今天想講一個數據建模的概念,叫做垃圾維度。從它的名字來看,你會認為這是一種貶義的技術,是你想要避免的東西,但它實際上是一種有用的方法。

事實上,我處理了來自一個問題,垃圾維度是它的完美解決方案。一旦你看到並理解了它,你就會發現它在你自己的工作中有很多應用。您可以在本博客底部觀看本教程的完整視頻。

目錄

什麼是垃圾維度?

Kimball 和 Ross 的The Data Warehouse Toolkit是維度建模的聖經之一,將其定義為典型的低基數標誌和指示符的分組。低基數意味著給定領域內的少量獨特觀察。

在我們的示例中,我們有一個用於構建定制 PC 業務的數據模型。數據模型與訂單和發票有關。我們還有許多標誌,我們可以在其中捕獲處理器類型、塔式配置類型(緊湊型或完整型)和用途(遊戲或工作站)。

垃圾維度:它是什麼以及為什麼它不是垃圾

使用廚房垃圾抽屜類比定義垃圾尺寸

如果您查看這些字段中的每一個,就會發現每個字段中只有兩個獨特的觀察結果。這就是 Kimball 所說的低基數標誌。他說,通過創建一個抽象維度,我們從事實表中刪除標誌,同時將它們放在一個有用的維度框架中。

廚房垃圾抽屜對垃圾維度的類比是一個很好的類比。每個人都有一個抽屜,裡面裝滿了橡皮筋、訂書釘、電池、生日蠟燭等等。這些東西有沒有自己的抽屜並不重要,但你需要有地方放它們。

保留它們會導致事實表的大小膨脹。假設我們有一個包含一百萬條記錄的事實表。我們建造了很多計算機,對於我們建造的每台計算機,我們都必須標記處理器、塔和用途。這意味著對於已訂購的 100 萬行 PC,我們在事實表中也有 300 萬個標誌。

減少事實表的大小

我們可以將這些移動到維度表並僅鏈接到模型 ID 以從事實表中刪除 300 萬個標誌。為此,我們可以為這些標誌中的每一個創建一個單獨的表,它會起作用。但是這個過程會使數據模型複雜化,而您通常希望避免使用單列表。

理想的解決方案是使用垃圾維度,其中有一堆以一般方式相關的低基數標誌。這些都與我們正在構建的計算機的屬性相關,但不是以您通常對特定維度表所採用的真正直接的方式。

審查論壇成員的問題

我們來看看論壇上發布的具體應用。該成員想要創建兩個不同的字段,一個用於Stalled,一個用於Active。如果客戶在過去 45 天內進行了交易,則它會被標記為活躍;否則,它會被標記為停滯。

垃圾維度:它是什麼以及為什麼它不是垃圾

該成員還想要另一個客戶類型維度表,即多訂單或單訂單。如果該帳戶在歷史上的任何時候使用一個帳號進行了兩次或更多次交易,則該帳戶將被視為多訂單客戶。如果他們對給定的帳號只有一個訂單,那將是一個單訂單客戶。

這就是我們想要開發的兩個標誌。讓我們進入 LuckyTemplates 並弄清楚如何做到這一點。

垃圾維度的數據建模

讓我們看一下數據模型。這是一個非常簡單的數據模型。我們有擴展的日期表交易表

垃圾維度:它是什麼以及為什麼它不是垃圾

我們的交易表只有三個字段:帳號發票日期銷售數量

垃圾維度:它是什麼以及為什麼它不是垃圾

一般來說,如果我們可以將轉換推得更靠近源頭,我們就會這樣做。這在報告會話過程中不是動態的,因此我們不需要在DAX中執行此操作。

如果可以的話,我們應該在 power query 或數據倉庫/SQL 中執行此操作。但現在,讓我們假設我們不這樣做,我們只是在power query中這樣做。

識別垃圾維度的客戶端類型

我們要做的第一件事是弄清楚客戶類型,是單訂單交易還是多訂單交易。我們將使用Group ByCountCount Rows

垃圾維度:它是什麼以及為什麼它不是垃圾

然後添加所有數據並進行所有行操作,以便我們返回的不是聚合表,而是每行中具有該行計數的初始表。

垃圾維度:它是什麼以及為什麼它不是垃圾

讓我們看看結果並展開它。

垃圾維度:它是什麼以及為什麼它不是垃圾

垃圾維度:它是什麼以及為什麼它不是垃圾

垃圾維度:它是什麼以及為什麼它不是垃圾

我們可以添加一個自定義列並將其命名為Client Type,然後創建一個 IF 語句。語句是如果Count等於1,則為單單;否則,它是多階的。

垃圾維度:它是什麼以及為什麼它不是垃圾

我們只需將列更改為文本類型。現在,我們在事實表中設置了兩個維度之一。

垃圾維度:它是什麼以及為什麼它不是垃圾

讓我們完成第二個維度表。對於這一個,如果最近的訂單距今天的日期不超過 45 天,則客戶被視為活躍。如果從今天起 45 天內沒有訂單,則客戶處於非活動狀態。

我們將添加一個自定義列並將該列命名為Today。然後添加DateTime.LocalNow為我們提供當前日期和時間,然後添加Date.From只為我們提供日期部分。

垃圾維度:它是什麼以及為什麼它不是垃圾

讓我們將其更改為日期數據類型,然後將該列移到前面。

垃圾維度:它是什麼以及為什麼它不是垃圾

有一種簡單的方法可以在兩個日期列之間創建減法。只需突出顯示這兩個日期,單擊功能區上的日期,然後單擊減去天數

垃圾維度:它是什麼以及為什麼它不是垃圾

這將為您提供這兩個日期之間的天數差異。讓我們將這個新列命名為Days Prior to Today。

垃圾維度:它是什麼以及為什麼它不是垃圾

下一步是找到今天之前的最少天數,這意味著每個帳號的最新訂單。如果該數字小於或等於 45,則它處於活動狀態。

讓我們再做一個Group By,然後是 Advanced,然後是Account Number

垃圾維度:它是什麼以及為什麼它不是垃圾

同樣,我們將使用All Data作為新列名,使用All Rows進行操作。

垃圾維度:它是什麼以及為什麼它不是垃圾

這一次,我們將添加Minimum Days Between with Minimum作為其操作,並將Days Prior to Today作為其列。這將為我們提供最新的訂單。

垃圾維度:它是什麼以及為什麼它不是垃圾

然後我們展開All Data並刪除Account Number

垃圾維度:它是什麼以及為什麼它不是垃圾

一旦我們展開它,我們就會有帳號的最小間隔天數。

垃圾維度:它是什麼以及為什麼它不是垃圾

最後,我們將添加另一個自定義列,並將其命名為Client Timing。我們將放入一個假設參數,如果我們的Min Days Between小於或等於 45,那麼它是ActiveStalled

垃圾維度:它是什麼以及為什麼它不是垃圾

垃圾維度:它是什麼以及為什麼它不是垃圾

刪除不需要的列

由於我們現在有很多支持列,讓我們單擊“選擇列”並刪除我們不需要的列。

垃圾維度:它是什麼以及為什麼它不是垃圾

我們將刪除CountTodayDays Prior to TodayMin Days Between列。我們現在只有原始事實表,加上Client TypeClient Timing列。

垃圾維度:它是什麼以及為什麼它不是垃圾

讓我們複製這個表,而不是將它們保存在事實表中。

垃圾維度:它是什麼以及為什麼它不是垃圾

我們將調用重複表Account Flags

垃圾維度:它是什麼以及為什麼它不是垃圾

讓我們回到交易表並取出客戶類型客戶時間字段。

垃圾維度:它是什麼以及為什麼它不是垃圾

我們現在有了原始事實表和帳戶標誌表。

垃圾維度:它是什麼以及為什麼它不是垃圾

垃圾維度:它是什麼以及為什麼它不是垃圾

對於 Account Flags 表,我們不需要Client TypeClient Timing字段,所以我們將它們去掉。我們只是突出顯示所有這些字段、刪除行並刪除重複項。

垃圾維度:它是什麼以及為什麼它不是垃圾

我們現在有了垃圾維度表。剩下的就是點擊Close & Apply。下一步是將Account Flags 表中的 Account Number連接到Transactions 表中的 Account Number

垃圾維度:它是什麼以及為什麼它不是垃圾

我們在 Transactions 表(這是我們的事實表)和 Account Flags 表(這是我們的垃圾維度表)之間有一個一對多的關係。


在 LuckyTemplates 中建立數據模型關係
LuckyTemplates 中的數據建模:技巧和最佳實踐

結論

讓我們將Client TimingClient Type維度放到我們的畫布中,並將它們變成切片器。我們現在可以準確地執行成員最初想要執行的操作,即根據這些屬性進行切片。

如果我們點擊多訂單,它只會讓我們看到那些有多個訂單的訂單,如果我們點擊單訂單,它會給我們留下那些只有一次購買的訂單。

垃圾維度:它是什麼以及為什麼它不是垃圾

總而言之,這基本上就是什麼是垃圾維度,以及如何創建它。如果您有一堆分類的、低基數的標誌,您希望以一種有效的方式將其合併到您的數據模型中,那麼這是一種非常有用的技術。

按所有行分組的技術對於創建這些垃圾維度非常有用。我希望你覺得這對你有幫助,而且一如既往。


什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

如何在 R 中保存和加載 RDS 文件

如何在 R 中保存和加載 RDS 文件

您將學習如何在 R 中保存和加載 .rds 文件中的對象。本博客還將介紹如何將對像從 R 導入 LuckyTemplates。

回顧前 N 個工作日——DAX 編碼語言解決方案

回顧前 N 個工作日——DAX 編碼語言解決方案

在此 DAX 編碼語言教程中,了解如何使用 GENERATE 函數以及如何動態更改度量標題。

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

本教程將介紹如何使用多線程動態可視化技術從報告中的動態數據可視化中創建見解。

LuckyTemplates 篩選上下文簡介

LuckyTemplates 篩選上下文簡介

在本文中,我將貫穿過濾器上下文。篩選上下文是任何 LuckyTemplates 用戶最初應該了解的主要主題之一。

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

我想展示 LuckyTemplates Apps 在線服務如何幫助管理從各種來源生成的不同報告和見解。

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

了解如何在 LuckyTemplates 中使用度量分支和組合 DAX 公式等技術計算利潤率變化。

DAX Studio 中數據緩存的物化想法

DAX Studio 中數據緩存的物化想法

本教程將討論數據緩存物化的想法,以及它們如何影響 DAX 在提供結果時的性能。

使用 LuckyTemplates 進行業務報告

使用 LuckyTemplates 進行業務報告

如果直到現在你還在使用 Excel,那麼現在是開始使用 LuckyTemplates 來滿足你的業務報告需求的最佳時機。

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的