如果希望你的 query 可以有不用修改 SQL 而更改一些條件來達到不同的搜尋結果,
Redash 有提供 Parameter 的功能讓非技術人員也能很輕易改變自己的搜尋條件
這邊我們用 relational MySQL Database 的 World Dataset 來做範例,
https://relational.fit.cvut.cz/dataset/CCS
在 BI 系統中最常出現的維度就是時間,在此資料集中,日期總共有四個結果:
如果以往我們想要只 query 出日期為 2012-08-24 的結果,我們 SQL 會這樣寫:
SELECT * FROM ccs.transactions_1k
WHERE `Date` = '2012-08-24'
而如果使用 Parameter 就是把 「2012-08-24
」這段取代成 「{{ 參數名稱 }}
」
注意:如果原來的搜尋條件是字串,請務必要把字串的單雙引號保留下來
(也可以用「{{ }}
」功能圖示來達到同樣效果)
在此例中我們讓參數名稱為 p_date
SELECT * FROM ccs.transactions_1k
WHERE `Date` = '{{ p_date }}'
預設參數在圖表上顯示的會是 SQL 中的參數名稱,
而通常我們在寫 SQL 很常會用英文命名方式,
Redash 也可對此設定,讓顯示在圖表上的可以修改 (設定圖示>Title)
注意:更改搜尋內容要記得按下 Execute 才會更新 query 的結果,
就如同直接改 SQL 一樣也是要按下同樣功能
Parameter 預設的 Type 是 Text,也就是我們在搜尋的時候,可以隨意輸入,
但伴隨而來的缺點就是,Parameter 是完全比對,
所以如果輸入錯誤就會 query 不出結果。
eg. 輸入 「2012/08/24」而非真正的值「2012-08-24」
這種時候就可以調整 Type 到一些常用的屬性,避免人為可能造成的輸入錯誤。
我們的搜尋條件是年月日格式的日期,Type 可以選擇 Date ,
就會有日曆可以方便選擇(還有可以直接選今天的時間),也能直接輸入日期文字來搜尋
注意:如果是只有年月日的格式,但 Type 卻選擇 Date and Time
而 Time 的資料又不是 00:00:00 這樣會無搜尋結果
但其實就算用了 Date 的屬性,還是有可能發生選了一個不在資料集的日期,
eg. 選擇 Today,但現在都已經是 2018 年,資料集根本沒有現在的資料
此時 Type 就可以用 Dropdown List 來把可能的選擇以空行分隔輸入,
來以下拉式選單限制搜尋的條件:
不過如果選項一多,一個個選項還要手動輸入總覺得不太方便,
在 Redash 之中,很多功能可以建立在已經建好的 query 上,
這邊我們可以另建一個 query 儲存起來
然後在原需要此條件清單當成 Parameter 的 query,
在 Type 選擇 Query Based Dropdown List,然後以剛才建立的清單 query 名稱搜尋,
就可以以其結果當成搜尋條件的下拉式選單。
注意:Redash 搜尋常是用名稱,而不是 Unique ID 之類的,
所以命名不要重複,而且要易懂,不然重複使用query一多的時候會很辛苦
在公司裡面,當非技術人員想要限制條件
eg. 訂單類別(團體、機票、旅館...)、日期、價格區間...
使用 Parameter 就可以讓他們自行調整而不需要再找工程師幫忙
另外有時他們會想要看到所有結果,
但同時也會想要能有經過 Parameter 條件的結果
這個時候我會用比較 tricky 一點的 SQL 語法來做到
在 Redash 中使用兩個名稱一樣的 Parameter 只會出現一個搜尋框
SELECT * FROM ccs.transactions_1k
WHERE ('{{p_date}}'='不限' or `Date` = '{{ p_date }}' )
因為如果是使用 SQL 的 query 結果,同時又想要有一些自定義的內容,
純用 SQL 語法是達不到的,這時我會多使用一個 Parameter:
SELECT * FROM ccs.transactions_1k
WHERE ('{{limit}}'='不限' or `Date` = '{{ p_date }}' )
ps. 文章同步發表於 Medium
想請問:如果query的條件是date range,那要如做寫query語法?!
SELECT * FROM ccs.transactions_1k
WHERE `Date` between ? and ?
SELECT *
FROM ccs.transactions_1k
WHERE `Date` BETWEEN '{{p_date.start}}' AND '{{p_date.end}}'
自問自答!