今天要說在後端的Cube.js Server連線DB後,對DB的請求需要做什麼樣的設置,也就是如何建立Schema,以及Query的語法應該長什麼樣子。
假設DB有張Table - users長這樣:
ID | PAYING | CITY | COMPANY_NAME |
---|---|---|---|
1 | true | San Francisco | Pied Piper |
2 | true | Palo Alto | Raviga |
3 | true | Redwood | Aviato |
4 | false | Mountain View | Bream-Hall |
5 | false | Santa Cruz | Hooli |
那麼第一部就需要先在後端的Cube.js先定義一張一樣的CUBE。
cube(`Users`, {
sql: `SELECT * FROM users`,
第二步,定義CUBE後,下一步是向多維數據集添加 度量和維度。
度量(Measures)被稱為定量數據,例如售出的單位數量、唯一訪問次數、利潤等。
維度(Dimensions)被稱為分類數據,例如狀態、性別、產品名稱或時間單位(例如,天、週、月)。
cube(`Users`, {
sql: `SELECT * FROM users`,
measures: {
count: {
sql: `id`,
type: `count`,
},
},
dimensions: {
city: {
sql: `city`,
type: `string`,
},
companyName: {
sql: `company_name`,
type: `string`,
},
},
});
type count
和 sql id
表示當通過 API 請求時,Cube.js 將生成並執行以下 SQL:
SELECT count(id) from users;
如果我們將城市維度應用於度量以查看“用戶在哪裡?”時,Cube.js 將生成帶有GROUP BY子句的SQL :
SELECT city, count(id) from users GROUP BY 1;
執行分組時,您可以根據需要向查詢添加任意數量的維度。
步驟三添加過濾器在度量(Measures)上
現在讓我們回答下一個問題——“我們有多少付費用戶?”。為此,我們將引入度量過濾器:
cube(`Users`, {
measures: {
count: {
sql: `id`,
type: `count`,
},
payingCount: {
sql: `id`,
type: `count`,
filters: [{ sql: `${CUBE}.paying = 'true'` }],
},
},
});
現在我們有了payingCount度量,它只顯示我們的付費用戶。當請求此度量時,Cube.js 將生成以下 SQL:
SELECT
count(
CASE WHEN (users.paying = 'true') THEN users.id END
) "users.paying_count"
FROM users
步驟四,使用計算量度
要回答“付費用戶佔總數的百分比?”,我們需要計算付費用戶比例,基本上是payingCount / count。Cube.js 使執行這種計算變得非常容易。讓我們向名為 的多維數據集添加一個新度量payingPercentage:
cube(`Users`, {
measures: {
count: {
sql: `id`,
type: `count`,
},
payingCount: {
sql: `id`,
type: `count`,
filters: [{ sql: `${CUBE}.paying = 'true'` }],
},
payingPercentage: {
sql: `100.0 * ${payingCount} / ${count}`,
type: `number`,
format: `percent`,
},
},
});
在這裡,我們定義一個計算度量值payingPercentage,其將 payingCount通過count。此示例說明如何在其他度量定義中引用度量。當您payingPercentage 通過 API請求度量時,將生成以下 SQL:
SELECT
100.0 * count(
CASE WHEN (users.paying = 'true') THEN users.id END
) / count(users.id) "users.paying_percentage"
FROM users