Snowflake 對於資料工程師和分析師來說,資料篩選是不可或缺的技能。LIMITTOPWHERE 子句是 Snowflake 中常用的資料篩選工具,但它們的潛力遠不止於此。本文將探討這些子句的用法、技巧以及一些在實際專案中會遇到的問題和解決方案,幫助你更有效率地操作 Snowflake 資料函式庫。

在 Snowflake 中,我們經常需要從大量的資料中提取特定資訊。這時,LIMIT 子句就能派上用場。它可以限制查詢傳回的行數,讓你快速預覽資料或進行抽樣分析。搭配 ORDER BY 子句,可以精確控制要傳回哪些資料列。例如,要取得銷售額最高的 10 筆訂單,可以使用 ORDER BY 根據銷售額降序排列,再用 LIMIT 限制傳回 10 行。TOP 子句功能類別似 LIMIT,語法更簡潔,但缺乏 OFFSET 的功能,無法跳過特定行數。WHERE 子句則是根據條件篩選資料,例如篩選特定日期範圍內的訂單,或是特定產品類別的銷售資料。它支援多種運算元,例如 ANDORNOTINBETWEENLIKE 等,可以組合複雜的篩選條件。此外,WHERE 子句還可以搭配子查詢,實作更進階的篩選邏輯。例如,可以先用子查詢找出符合特定條件的客戶 ID,再用 WHERE 子句篩選出這些客戶的訂單資料。

Snowflake 中資料篩選的藝術:LIMITTOPWHERE 的深度應用

在 Snowflake 的世界裡,資料篩選是資料分析師和工程師的日常。LIMITTOPWHERE 子句是我們最常用的工具。但你真的瞭解它們的全部潛力嗎?讓玄貓(BlackCat)帶你深入探索這些語法的奧妙,並分享一些在實際專案中我所學到的經驗。

LIMIT 的精準控制:資料取樣的藝術

LIMIT 子句允許你限制查詢傳回的行數。這在處理大型資料集時非常有用,可以快速檢視資料的樣本。

-- 取得供應商帳戶餘額最低的 10 家
SELECT s_name, s_acctbal
FROM supplier
ORDER BY s_acctbal ASC
LIMIT 10;

這段程式碼會回傳 supplier 表格中 s_name(供應商名稱)和 s_acctbal(帳戶餘額)兩欄,並依照 s_acctbal 遞增排序,只顯示前 10 筆資料。

內容解密:

  • SELECT s_name, s_acctbal: 指定要選取的欄位,分別是供應商名稱和帳戶餘額。
  • FROM supplier: 指定要從哪個資料表選取資料,這裡是指 supplier 資料表。
  • ORDER BY s_acctbal ASC: 依照帳戶餘額 (s_acctbal) 欄位遞增排序 (ASC)。
  • LIMIT 10: 限制查詢結果只顯示前 10 筆資料。

有時候,我們可能想要取得排序後的最後幾筆資料。雖然 Snowflake 目前不直接支援 LIMIT -10 這種語法,但我們可以透過反向排序來達成:

-- 取得供應商帳戶餘額最高的 10 家
SELECT s_name, s_acctbal
FROM supplier
ORDER BY s_acctbal DESC
LIMIT 10;

玄貓提醒: 在處理大量資料時,LIMIT 可以幫助你快速檢視資料,驗證查詢邏輯,避免不必要的資源消耗。

TOP 的簡潔語法:快速取得頂端資料

TOP 關鍵字是另一種限制結果集大小的方式。它通常與 ORDER BY 結合使用,以取得排序後的頂端 N 行。

-- 取得帳戶餘額最高的 10 家供應商
SELECT TOP 10 s_name, s_acctbal
FROM supplier
ORDER BY s_acctbal DESC;

這段程式碼和使用 LIMIT 的範例效果相同,但語法更簡潔。

玄貓分析: TOP 語法雖然簡潔,但缺乏 LIMITOFFSET 功能。如果你需要跳過前幾行資料,LIMIT 會是更好的選擇。

WHERE 的精準篩選:資料過濾的核心

WHERE 子句是 SQL 中最核心的資料篩選工具。它允許你根據特定條件過濾資料,只傳回符合條件的行。

條件評估:ANDOR 的邏輯

WHERE 子句可以包含一個或多個條件,並使用 ANDOR 運算元組合這些條件。

  • AND 運算元: 所有條件都必須為真,結果才會被包含。
  • OR 運算元: 只要有一個條件為真,結果就會被包含。

例如:

-- 尋找住在加州與姓 Smith 的人
WHERE last_name = 'SMITH' AND state = 'CA'

-- 尋找姓 Smith 或住在加州的人
WHERE last_name = 'SMITH' OR state = 'CA'

玄貓經驗: ANDOR 的使用會極大影響結果集的大小。在撰寫複雜的 WHERE 子句時,務必仔細考慮邏輯關係。

括號的力量:控制條件的優先順序

WHERE 子句包含多個條件時,可以使用括號來明確指定條件的優先順序。

-- 尋找姓 Smith 或 Jackson,與住在加州或華盛頓的人
WHERE (last_name = 'SMITH' OR last_name = 'JACKSON')
  AND (state = 'CA' OR state = 'WA')

玄貓建議: 為了程式碼的可讀性和避免歧義,建議在複雜的 WHERE 子句中使用括號。

NOT 運算元:排除特定條件

NOT 運算元可以反轉條件的結果。例如,要找到所有住在加州的人:

WHERE NOT state = 'CA'

或者,要找到是姓 Smith 與住在加州的人:

WHERE NOT (last_name = 'SMITH' AND state = 'CA')

玄貓提醒: 使用 NOT 運算元時要小心,確保你的邏輯是正確的。雙重否定可能會導致意想不到的結果。

LIMITTOPWHERE 子句是 Snowflake 中資料篩選的根本。掌握它們的用法,你就能夠更有效地查詢和分析資料。玄貓(BlackCat)希望這些經驗分享能幫助你在實際專案中更上一層樓。

玄貓解讀:SQL 篩選資料的藝術與實戰

在資料函式庫的世界裡,篩選資料是一項核心技能。如同廚師挑選食材、畫家選擇顏料,精準的篩選能讓資料分析事半功倍。本文中,玄貓(BlackCat)將帶領大家探討 SQL 中各種資料篩選技巧,並分享一些實戰經驗。

為何我放棄 NOT:SQL 條件的另一種解讀

在 SQL 的 WHERE 語法中,NOT 運算元常常讓人感到困惑。有時候,它就像一把雙面刃,用得好可以簡化邏輯,用不好反而讓程式碼難以理解。

例如,以下語法旨在找出 last_name 不是 ‘SMITH’ 或 ‘JACKSON’,與 state 不是 ‘CA’ 或 ‘WA’ 的所有資料列:

WHERE NOT ((last_name = 'SMITH' OR last_name = 'JACKSON')
           AND (state = 'CA' OR state = 'WA'))

初看之下,這段程式碼似乎很直觀,但仔細分析,你會發現它實際上是在排除符合特定條件的資料列。對玄貓(BlackCat)來說,這種寫法並不夠清晰。

玄貓建議: 盡可能避免使用 NOT 運算元,尤其是在複雜的條件判斷中。以下是使用 NOT 的替代方案:

WHERE last_name <> 'SMITH' 
  AND last_name <> 'JACKSON'
  AND state <> 'CA' 
  AND state <> 'WA'

這個語法更易於理解,因為它直接表達了「last_name 不等於 ‘SMITH’ 與不等於 ‘JACKSON’,state 不等於 ‘CA’ 與不等於 ‘WA’」的邏輯。

SQL 條件的組成要素:表示式與運算元的完美結合

一個有效的 SQL 條件,就像一首動聽的樂曲,需要不同的音符(表示式)和節拍(運算元)巧妙地組合在一起。

表示式 (Expression) 的種類別:

  • 資料表欄位 (Column):customer_idorder_date 等。
  • 數值 (Number) 或日期 (Date):123'2023-10-26'
  • 字串 (String):'台北市'
  • 內建函式 (Built-in Function):CONCAT('玄貓', ' BlackCat')
  • 子查詢 (Subquery): 嵌入在主要查詢中的查詢。
  • 表示式清單 (List of Expressions):('台北', '台中', '高雄')

運算元 (Operator) 的種類別:

  • 比較運算元 (Comparison Operators):= (等於)、< (小於)、> (大於)、!=<> (不等於)、LIKEINBETWEEN
  • 算術運算元 (Arithmetic Operators):+ (加)、- (減)、* (乘)、/ (除)。

等值條件:精準鎖定目標資料

等值條件 (Equality Conditions) 是 SQL 中最常見的篩選方式之一。它透過 = 運算元,將欄位與特定值進行比較,精準鎖定符合條件的資料列。

範例:

SELECT n_name, r_name
FROM nation 
JOIN region ON nation.n_regionkey = region.r_regionkey
WHERE r_name = 'ASIA';

這個語法會找出所有位於亞洲 (ASIA) 地區的國家 (nation)。在 FROM 子句中,nation.n_regionkey = region.r_regionkey 也是一個等值條件,用於連線 nationregion 兩個資料表。

不等值條件:排除特定選項

與等值條件相反,不等值條件 (Inequality Conditions) 使用 !=<> 運算元,排除符合特定條件的資料列。

範例:

SELECT n_name, r_name
FROM nation 
JOIN region ON nation.n_regionkey = region.r_regionkey
WHERE r_name <> 'ASIA';

這個語法會找出所有位於亞洲 (ASIA) 地區的國家 (nation)。

範圍條件:資料的時間軸與數值區間

範圍條件 (Range Conditions) 常用於篩選數值或日期範圍內的資料。BETWEEN 運算元讓您可以輕鬆指定上下限,選取落在這個區間內的資料列。

範例 (數值範圍):

SELECT s_suppkey, s_name
FROM supplier
WHERE s_suppkey BETWEEN 1 AND 10;

這個語法會找出 s_suppkey 介於 1 到 10 (包含 1 和 10) 之間的供應商 (supplier)。

範例 (日期範圍):

SELECT o_orderkey, o_custkey, o_orderdate
FROM orders
WHERE o_orderdate BETWEEN
    TO_DATE('1998-01-29', 'YYYY-MM-DD') AND 
    TO_DATE('1998-01-30', 'YYYY-MM-DD');

這個語法會找出 o_orderdate 介於 1998 年 1 月 29 日到 1998 年 1 月 30 日 (包含這兩天) 之間的訂單 (orders)。

玄貓提醒: BETWEEN 運算元是包含上下限的。

成員條件:多重選項的快速篩選

成員條件 (Membership Conditions) 使用 IN 運算元,快速篩選符合多個特定值的資料列。

範例:

假設 Customer 資料表有一個 c_mktsegment 欄位,包含 ‘AUTOMOBILE’、‘MACHINERY’、‘BUILDING’、‘HOUSEHOLD’ 和 ‘FURNITURE’ 等值。以下語法可以找出 c_mktsegment 為 ‘AUTOMOBILE’、‘MACHINERY’ 或 ‘BUILDING’ 的客戶:

WHERE c_mktsegment IN ('AUTOMOBILE', 'MACHINERY', 'BUILDING')

玄貓小技巧: 使用 IN 運算元比使用多個 OR 條件更簡潔易讀。

SQL 煉金術:用 WHERE 條件精準篩選資料

在資料函式庫的世界裡,資料就像未經提煉的礦石。要從中提取出有價值的資訊,你需要像一位煉金術師,運用各種過濾條件,精準地篩選出目標資料。SQL 的 WHERE 子句就是你的煉金工具,它能讓你根據特定條件,從資料表中提取出你需要的資料。

多重條件的藝術:AND 與 OR 的妙用

有時候,單一條件並不足以精確鎖定目標。這時,你可以使用 ANDOR 運算元,組合多個條件,構建更複雜的過濾邏輯。

例如,假設你要找出所有居住在「台北」與年齡大於 30 歲的客戶:

SELECT *
FROM 客戶
WHERE 城市 = '台北'
  AND 年齡 > 30;

AND 運算元要求所有條件都必須成立,才會傳回該筆資料。

另一方面,OR 運算元則允許只要其中一個條件成立,就傳回該筆資料。例如,找出所有居住在「台北」或「台中」的客戶:

SELECT *
FROM 客戶
WHERE 城市 = '台北'
   OR 城市 = '台中';

範圍過濾:BETWEEN 的簡潔之道

當你需要篩選出落在特定範圍內的資料時,BETWEEN 運算元能讓你的 SQL 語法更簡潔。例如,找出所有年齡介於 25 到 35 歲之間的客戶:

SELECT *
FROM 客戶
WHERE 年齡 BETWEEN 25 AND 35;

BETWEEN 運算元包含指定的範圍邊界值。

集合成員判斷:IN 的高效應用

如果你的過濾條件是一組離散的值,IN 運算元可以讓你避免撰寫多個 OR 條件。例如,找出所有來自「美國」、「加拿大」或「英國」的客戶:

SELECT *
FROM 客戶
WHERE 國家 IN ('美國', '加拿大', '英國');

IN 運算元會檢查欄位的值是否包含在指定的集合中。你也可以使用 NOT IN 來排除集合中的值。

模糊比對:LIKE 的靈活搜尋

有時候,你並不需要完全精確的比對,而是希望根據某種模式來搜尋資料。這時,LIKE 運算元就派上用場了。LIKE 運算元使用萬用字元來定義搜尋模式:

  • %:比對任意數量的字元(包括零個字元)。
  • _:比對單個字元。

例如,找出所有名字以「陳」開頭的客戶:

SELECT *
FROM 客戶
WHERE 姓名 LIKE '陳%';

或者,找出所有名字第二個字是「明」的客戶:

SELECT *
FROM 客戶
WHERE 姓名 LIKE '_明%';

更進階的,Snowflake 提供了 regexp_like() 函式,讓你使用正規表示式來進行更複雜的模式比對。例如,找出所有名字以「M」或「U」開頭的國家:

SELECT n_name
FROM nation
WHERE regexp_like(n_name, '^[MU].*');

NULL 值的處理:IS NULL 的正確用法

在資料函式庫中,NULL 代表缺失或未知的值。在過濾條件中,你不能使用 = 運算元來判斷一個值是否為 NULL。你必須使用 IS NULLIS NOT NULL 運算元。

例如,假設我們有一個 null_example 表格:

CREATE TABLE null_example (
  num_col NUMBER,
  char_col VARCHAR(10)
) AS
SELECT *
FROM (
  VALUES (1, 'ABC'),
         (2, 'JKL'),
         (NULL, 'QRS'),
         (3, NULL)
);

要找出 num_colNULL 的資料列,你可以這樣寫:

SELECT *
FROM null_example
WHERE num_col IS NULL;

要找出 num_col 不為 NULL 的資料列,你可以這樣寫:

SELECT *
FROM null_example
WHERE num_col IS NOT NULL;

NULL 值在 SQL 中是一個需要特別注意的概念。記住,NULL 不等於任何值,包括它自己。

玄貓的經驗分享

玄貓在過去的專案中,曾經遇到一個案例,需要從一個包含大量客戶資料的資料表中,篩選出特定地區的高價值客戶。一開始,我使用了多個 OR 條件來比對不同的地區,但 SQL 語法變得非常冗長與難以維護。後來,我改用了 IN 運算元,將所有目標地區放入一個集合中,SQL 語法瞬間變得簡潔易讀,效能也得到了提升。

玄貓解讀:資料過濾的藝術 - 從基礎到Snowsight進階應用

在資料函式庫操作中,過濾資料是不可或缺的一環。它就像是廚師手中的篩網,幫助我們從海量資料中提取出真正需要的資訊。本文玄貓將探討如何使用SQL語法和Snowsight工具來有效地過濾資料,特別是針對NULL值的處理,並分享一些實戰技巧。

NULL值的陷阱與解法

在資料函式庫中,NULL代表缺失或未知的資料。這使得NULL值的處理變得微妙。例如,當我們嘗試用等號(=)來比較一個欄位與NULL時,結果永遠是false。

考慮以下null_example表:

NUM_COL CHAR_COL
1 ABC
2 JKL
NULL QRS

如果我們執行以下查詢:

SELECT num_col, char_col
FROM null_example
WHERE num_col < 3;

這個查詢會傳回前兩行,但第三行因為num_col是NULL而被排除在外。要包含NULL值的行,我們需要使用IS NULL條件:

SELECT num_col, char_col
FROM null_example
WHERE num_col < 3 OR num_col IS NULL;

這樣,所有num_col小於3或為NULL的行都會被包含在結果中。

NVL()函式:NULL值的救星

為了簡化NULL值的處理,許多資料函式庫(包括Snowflake)提供了內建函式。其中一個是NVL()函式,它可以將NULL值替換為指定的值。

例如,以下查詢使用NVL()函式將num_col中的NULL值替換為0:

SELECT num_col, char_col
FROM null_example
WHERE NVL(num_col, 0) < 3;

這個查詢的結果與之前的查詢相同,但使用了更簡潔的語法。

如果我們也想在結果集中替換NULL值,可以在SELECT子句中使用NVL()函式:

SELECT NVL(num_col, 0) AS num_col, char_col
FROM null_example
WHERE NVL(num_col, 0) < 3;

這樣,結果集中的num_col欄位就不會再有NULL值了。

玄貓經驗:掌握NULL值的關鍵

玄貓建議,當使用不熟悉的資料函式庫時,務必先了解哪些欄位允許NULL值。這能幫助你建立更精確的過濾條件,避免遺漏重要資料。

Snowsight的進階過濾技巧

除了SQL語法,Snowsight還提供了一些額外的過濾工具,讓資料分析更加便捷。

:daterange:時間範圍的魔法棒

當過濾日期欄位時,可以使用內建的:daterange表示式。它允許你使用不同的日期或日期範圍執行相同的查詢。

例如,在WHERE子句中加入:daterange後,Snowsight會在介面左上方新增一個選單,讓你選擇預設的時間範圍,或自訂時間範圍。

自訂過濾器:開發你的專屬工具

Snowsight還允許你建立自訂過濾器,並在多個查詢中使用。要建立新的過濾器,點選介面左上方的選單,選擇"Manage Filters"。

玄貓以Orders表中的o_orderpriority欄位為例,這個欄位有以下值:

O_ORDERPRIORITY
4-NOT SPECIFIED
2-HIGH
3-MEDIUM
1-URGENT
5-LOW

可以透過點選"Write Query"並貼上用於產生這些值的查詢,將這些值新增到過濾器中。

儲存過濾器後,就可以在查詢中使用它來選擇特定的訂單優先順序。

玄貓提醒:善用Snowsight的查詢歷史

如果你想檢視實際執行的查詢,可以在Snowsight主選單中找到"Activity>Query History",這裡會顯示所有已執行的查詢,包括套用的過濾器值。

測驗你的知識

以下練習旨在測試你對過濾條件的理解。

練習 2-1

Customer表中檢索c_namec_acctbal(帳戶餘額)欄位,但僅限於c_mktsegment為’MACHINERY’與帳戶餘額大於9998的行。