天天看點

Tableau 我常用函數整理

整理下我最近常用的 Tableau 函數, 在計算字段時會用到, 包括, 時間, 字元串, 聚合, LOD等.

日期函數

dateadd

  • datedadd (date_part, interval, date) 表示在日期 date 的基礎上, 以date_part 為機關, 與之間隔 interval的日期
  • dateadd ("month", -3, #2020/3/8#) 則傳回 2019/12/8 0:00:00;
  • dateadd("day", -7, #2020/3/8#) 則傳回 2020/3/1 0:00:00 檢視過去一周, 半年, 3個月等的日期會用到.

datediff

  • datediff (date_part, start_date, end_date, [start_of_week]) 計算兩日期的差, 以 date_part 為機關.
  • datediff("week", #2020/3/8#, #2020/3/9#) 傳回 0 , 3/8 與 3/9 相差 0 周
  • datediff("week", #2020/3/8#, #2020/3/9#, "monday") 傳回 1 因為 3/8 是周日, 一周開始若為周一, 則相差一周啦.

isdate

  • isdate (string) 判斷一個字元串是否為有效日期. 是則傳回 "真", 否則 "僞"
  • isdate("2020/3/8") ; isdate("2020-03-8") 傳回 "真"

makeday

  • makeday (year, month, day) 構造一個包含 年, 月, 日 的日期值, 常用于資料提取, 日期比較等
  • makeday (2020, 3, 8) 則傳回 2020/3/8

maketime

  • maketime (hour, minute, second) 構造一個包含 時, 分, 秒 的日期值
  • maketime (8, 30, 0) 則傳回 1899/12/30 8:30:00

max, min

  • max (date1, date2) 也可用于比較兩個時間, 傳回 較近/ 較遠 的一個距今
  • max (#2020/1/1#, #2020-3-8#) 傳回 2020/3/8; min 則是相反的用法

now

  • now () 傳回目前的日期和時. 配合 date, year, month 就很靈活了.
  • now () 傳回 2020/3/8 23: 22:26
  • year(now()), month (now ()), date(now()) 分别傳回 2020, 3, 2020/3/8

today

  • 傳回今天的日期. today () 則傳回 2020/3/8 . 經常用作與一個 動态的參數值. 比如日報中算環比, 同比都會用到

類型轉換

date

  • 将給定的 字元串, 數字, 日期 表達式轉為日期類型. 常用于強行轉換, 比如對 資料庫中的各種時間強行轉換
  • date("2020/3/8") 和 date("2020-3-8 2:22:22") 和 date(2020, 3, 8) 都傳回 2020/3/8 這樣就能準确比較了

datetime

  • 跟 date () 一樣的, 隻不過更加精确到 時, 分秒. 也是會用在時間的比較上的
  • datetime ("2020-3-8 22:22:22") 傳回 2020/3/8 22:22:22; 而 datetime ("2020/3/8") 傳回 2020/3/8 0:00:00

float, int

  • 将表達式轉為 浮點數或整數. 注意的是 int 不是四舍五入, 而是直接取整.
  • 時間其實也是一個 數字類型. int (#2020-3-8#) 傳回 43896; int("666") 傳回 666; int("aaa") 則啥都沒有.

str

  • 将表達式轉為字元串類型. 可用于, 字元串的拼接. 如 字段拼接, 構造唯一值等場景. 大類, 小類 排序會用到

邏輯函數

if

  • if 條件 then 表達式 end
  • if 條件 then 表達式1 else 表達式2 end
# 多層嵌套

if [當期值] > 10000 
    then if [同期值] > 10000
        then "1好"
        else "2好"
        end
        
elseif [當期值] <= 10000 and [當期值] > 5000
    then "較好"
    else "不好"
    end
    
....      

case

  • 跟 if 的作用基本一樣, 但使用更加友善, 尤其在傳回結果比較多的情況下
case 表達式
when 值1 then return1
when 值2 then return2
when 值3 then return3
...
else reurnx
end      

比如, 對 "省市" 字段進行 區域的劃分 (建立計算字段 "大區")

case [省市]
when "吉林" or "遼甯" or "黑龍江" then "東北"
when "安徽" or "江蘇" or "浙江" or "福建" then "華東"
when "江西" or "河南" or "湖北" then "華中"

else "未劃分"
end      

ifnull

  • ifnull (expr1, expr2) 如果結果不是 null, 則傳回 expr1 否則 傳回 expr2 判斷時可對 if xxx else ... 優化
  • ifnull ([當期值], [同期值]) 等價于, 将當期值的 缺失值 用 同期值填充了.

isnull

  • isnull (expr) 傳回布爾值. 如果表達式為 null 則傳回 "真" 否則傳回 "僞"
  • 注意的是, isnull (null) 傳回 "真"; isull(" ") 傳回 "僞". 空字元串不是空哦, 注意跟有點程式設計語言的區分

聚合函數

Tableau 的拖拽字段到行列, 其實就是執行了大緻 SQL: 聚合函數(度量字段) group by [次元]. 預設是 sum. 這就解釋了在計算字段的時候, 有的時候需要手動加 sum, 有時候又不需要. 這就需要想想它 原本的 sql 大緻是怎樣的邏輯即可

count

  • 對離散或度量字段, 進行計數, 會忽略 null 值, 不去重

countd

  • 對離散或度量字段, 進行計數, 會忽略 null 值,會去重
  • 統計門店資料量, 大區啥的都經常會用到. 注意,表連接配接(混合資料源) 不能用 countd. 可通過 sql來Union解決

sum

  • 隻能對度量字段 求和, 會忽略 Null 值. Tableau 預設對度量字段聚合,要看每一條則在 資料 -> 取消聚合 即檢視

avg

  • 隻能用于度量字段 求均值, 會忽略 Null 值

max, min

  • 度量字段的最值; 傳字元串則傳回原值; 也可用做兩個時間比較(如上提到)

attr

  • attr ([expr]) 如果 expr 的每一行都有值, 則傳回該值. 否則傳回 * , 會忽略 Null 值

median

  • 隻能用于度量字段, 求中位數, 會忽略 Null 值

表計算函數

total

  • 傳回給定表達式的總計, 常用于計算 各自分區中 的全部行的 聚合值等
  • total (sum([銷售量])) 表示計算 各自分區中的全部行的 sum([銷售量])

index

  • 傳回分區中目前行的索引, 不包含于是值相關的任何排序. 常用于對某個字段和 [手機品牌] 按特定的順序排列

....

這部分很多, 但目前很多, 沒用到, 或者是不會用.

詳細級别函數

也稱為 " LOD" 表達式 或 "LOD" 計算.

是除視圖級别外, 的其他次元上支援聚合, 能實作将 一或多個 次元 附加到 任何的聚合表達式.

與表計算, 參考線等不同在于, LOD 是在資料源中計算的. 針對大型資料源, 會大幅度提高性能 但同時也會導緻 Tableau 運作更加複雜的查詢 (如多表連接配接), 在基礎資料源緩慢的情況下, 影響性能.

  • 固定(fixed) : 靈活選擇高于 或 低于視圖層, 各個次元進行 group by 再 aggregation
  • 包含( include): 用于建立高于視圖層的, 來分組聚合.
  • 排除( eclude): 用于建立低于視圖層的, 來進行分組聚合.

表達也似乎不大準确, 舉個栗子就好了.

fixed

  • {fixed [次元1], [次元2]... : 聚合函數 (度量字段)} 表示 對次元 dim1, dim2 ... 的次元進行聚合操作.
  • fixed 計算 在次元篩選器 之前應用, 但會受到 上下文篩選器, 資料源篩選器, 和資料提取篩選器的影響. 如果想要将篩選器應用于 fixed 表達式級别 而又不想用 上下文篩選器. 則可将其改為 include 或 exclude 表達式

通常用 fixed 這樣的 LOD 表達式, 可以生成度量或次元.

  • {fixed [商品ID] : sum ([銷量])} 是計算, 每件商品, 銷量的總和
  • {fixed [商品ID], [年份] : sum ([銷量]) 是計算每件商品, 每年 的銷量總和
  • {fiexd [商品ID] : min ([訂單日期]) 是計算, 每件商品的, 最早訂單日期

來個栗子, 以超市資料為例, 計算 每個地區中, 每個省份的銷售量, 先建一個計算字段.

Tableau 我常用函數整理

然後再将 "地區" 和 "省" 放到列, 再将 地區映射到 顔色做區分.

Tableau 我常用函數整理

與之相關的還有 include 和 exclude 的 LOD 表達式, 我暫時沒有用到過, 就不寫了先. 用到再說吧.

我感覺, 這個 Tableau , 慢慢用下來, 還是有點香的, 慢慢記錄有空的話.

繼續閱讀