แนวทางปฏิบัติที่ดีที่สุดสำหรับการสร้างการคำนวณใน Tableau
บทความนี้จะอธิบายถึงเคล็ดลับและคำแนะนำต่างๆ สำหรับการสร้างการคำนวณที่มีประสิทธิภาพใน Tableau คำแนะนำเหล่านี้มีไว้เพื่อช่วยปรับปรุงประสิทธิภาพของเวิร์กบุ๊กให้เหมาะสมกับคุณ หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับวิธีต่างๆ ที่คุณสามารถใช้เพื่อปรับปรุงประสิทธิภาพของเวิร์กบุ๊ก โปรดดู ซีรีส์ เพิ่มประสิทธิภาพของเวิร์กบุ๊ก
กฎทั่วไป: หลีกเลี่ยงการใช้ฟิลด์ที่คำนวณหลายๆ ครั้งในการคำนวณอื่น
การอ้างอิงถึงฟิลด์ที่คำนวณฟิลด์เดิมหลายครั้งในการคำนวณอื่นๆ จะส่งผลให้เกิดปัญหาด้านประสิทธิภาพได้ หากคุณใช้ฟิลด์ที่คำนวณในการคำนวณ (หรือที่เรียกกันว่าการสร้างการคำนวณที่ซ้อนกัน) ให้อ้างอิงถึงฟิลด์ดังกล่าวในการคำนวณเพียงครั้งเดียวเท่านั้น
โปรดทราบว่าการอ้างอิงถึงฟิลด์ดังกล่าว (ฟิลด์เทอร์มินัล) หลายๆ ครั้งในการคำนวณจะไม่เป็นการลดประสิทธิภาพลง
ตัวอย่าง
สมมติว่าคุณสร้างฟิลด์ที่คำนวณที่ใช้การคำนวณหลายบรรทัดที่ซับซ้อนเพื่อค้นหาการกล่าวถึง หรือชื่อรองของ Twitter ในทวีต ฟิลด์ที่คำนวณดังกล่าวมีชื่อว่า Twitter Handle ชื่อรองแต่ละรายการดังกล่าวที่ส่งคืนจะเริ่มต้นด้วยเครื่องหมาย '@' (เช่น: @user)
สำหรับการวิเคราะห์ คุณต้องลบสัญลักษณ์ '@' ออก
หากต้องการทำเช่นนั้น คุณสามารถใช้การคำนวณต่อไปนี้เพื่อลบตัวอักษรตัวแรกออกจากสตริง:
RIGHT([Twitter Handle], LEN([Twitter Handle]) -1)
การคำนวณนี้ค่อนข้างเรียบง่าย แต่เนื่องจากเป็นการอ้างอิงถึงการคำนวณ Twitter Handle ถึงสองครั้ง จึงมีการดำเนินการคำนวณดังกล่าวสองครั้งสำหรับระเบียนแต่ละรายการในแหล่งข้อมูลของคุณ ครั้งแรกสำหรับฟังก์ชัน RIGHT และอีกครั้งสำหรับฟังก์ชัน LEN
หากต้องการหลีกเลี่ยงการคำนวณแบบเดียวกันมากกว่าหนึ่งครั้ง คุณสามารถเขียนการคำนวณใหม่ให้กับรายการที่ใช้การคำนวณ Twitter Handle เพียงหนึ่งครั้งได้ ในตัวอย่างนี้ คุณสามารถใช้ MID เพื่อบรรลุเป้าหมายเดียวกันได้:
MID([Twitter Handle], 2)
เคล็ดลับที่ 1: แปลงการเปรียบเทียบความเท่ากันหลายรายการให้กับนิพจน์ CASE หรือกลุ่ม
ลองสมมติว่าคุณมีการคำนวณต่อไปนี้ที่ใช้ฟิลด์ที่คำนวณ Person (calc) หลายครั้งและใช้ชุดฟังก์ชัน OR การคำนวณนี้แม้มีนิพจน์ทางตรรกศาสตร์ที่เรียบง่ายแต่อาจทำให้เกิดปัญหาด้านประสิทธิภาพของการสืบค้นได้เนื่องจากมีการดำเนินการคำนวณ Person (calc) อย่างน้อยสิบครั้ง
IF [Person (calc)] = 'Henry Wilson'
OR [Person (calc)] = 'Jane Johnson'
OR [Person (calc)] = 'Michelle Kim'
OR [Person (calc)] = 'Fred Suzuki'
OR [Person (calc)] = 'Alan Wang'
THEN 'Lead'
ELSEIF [Person (calc)] = 'Susan Nguyen'
OR [Person (calc)] = 'Laura Rodriguez'
OR [Person (calc)] = 'Ashley Garcia'
OR [Person (calc)] = 'Andrew Smith'
OR [Person (calc)] = 'Adam Davis'
THEN 'IC'
END
แทนที่จะใช้การเปรียบเทียบความเท่ากัน ให้ลองใช้โซลูชันดังต่อไปนี้
โซลูชัน 1
ใช้นิพจน์ CASE ตัวอย่าง:
CASE [Person (calc)]
WHEN 'Henry Wilson' THEN 'Lead'
WHEN 'Jane Johnson' THEN 'Lead'
WHEN 'Michelle Kim' THEN 'Lead'
WHEN 'Fred Suzuki' THEN 'Lead'
WHEN 'Alan Wang' THEN 'Lead'
WHEN 'Susan Nguyen' THEN 'IC'
WHEN 'Laura Rodriguez' THEN 'IC'
WHEN 'Ashley Garcia' THEN 'IC'
WHEN 'Andrew Smith' THEN 'IC'
WHEN 'Adam Davis' THEN 'IC'
END
ในตัวอย่างนี้ จะมีการอ้างถึงฟิลด์ Person (calc) ที่คำนวณเพียงหนึ่งครั้ง ดังนั้นจึงมีการดำเนินการเพียงครั้งเดียวเท่านั้น นิพจน์ CASE ยังมีการปรับปรุงให้เหมาะสมเพิ่มเติมในกระบวนการค้นหา ดังนั้นคุณจึงได้รับประโยชน์ด้านประสิทธิภาพเพิ่มเติมอีกด้วย
โซลูชัน 2
สร้างกลุ่มแทนฟิลด์ที่คำนวณ หากต้องการข้อมูลเพิ่มเติม โปรดดู จัดกลุ่มข้อมูลของคุณ
เคล็ดลับที่ 2: แปลงการคำนวณหลายสตริงให้เป็นนิพจน์ REGEXP เดียว
หมายเหตุ: นิพจน์ REGEXP จะสามารถใช้งานได้เฉพาะเมื่อใช้การแยกข้อมูล Tableau หรือเมื่อเชื่อมต่อกับ Text File, Hadoop Hive, Google BigQuery, PostgreSQL, Tableau Data Extract, Microsoft Excel, Salesforce, Vertica, Pivotal Greenplum, Teradata (เวอร์ชัน 14.1 ขึ้นไป) และแหล่งข้อมูล Oracle หากต้องการข้อมูลเพิ่มเติม โปรดดูฟังก์ชันเพิ่มเติม
ตัวอย่าง 1: CONTAINS
ลองสมมติว่าคุณมีการคำนวณต่อไปนี้ที่ใช้ฟิลด์ที่คำนวณ Category (calc) หลายครั้ง การคำนวณนี้แม้มีนิพจน์ทางตรรกศาสตร์ที่เรียบง่ายแต่อาจทำให้เกิดปัญหาด้านประสิทธิภาพของการค้นหาได้เนื่องจากมีการดำเนินการคำนวณ Category (calc) หลายครั้ง
IF CONTAINS([Segment (calc)],'UNKNOWN')
OR CONTAINS([Segment (calc)],'LEADER')
OR CONTAINS([Segment (calc)],'ADVERTISING')
OR CONTAINS([Segment (calc)],'CLOSED')
OR CONTAINS([Segment (calc)],'COMPETITOR')
OR CONTAINS([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
ELSE [Segment (calc)] END
คุณสามารถใช้นิพจน์ REGEXP เพื่อให้ได้ผลลัพธ์เดียวกันโดยไม่ต้องดำเนินการซ้ำหลายครั้ง
โซลูชัน
IF REGEXP_MATCH([Segment (calc)], 'UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT') THEN 'UNKNOWN'
ELSE [Segment (calc)] END
คุณสามารถใช้นิพจน์ REGEXP เดียวกันกับการคำนวณสตริงที่ใช้รูปแบบเดียวกันได้
ตัวอย่างที่ 2: STARTSWITH
IF STARTSWITH([Segment (calc)],'UNKNOWN')
OR STARTSWITH([Segment (calc)],'LEADER')
OR STARTSWITH([Segment (calc)],'ADVERTISING')
OR STARTSWITH([Segment (calc)],'CLOSED')
OR STARTSWITH([Segment (calc)],'COMPETITOR')
OR STARTSWITH([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
โซลูชัน
IF REGEXP_MATCH([Segment (calc)], '^(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)') THEN 'UNKNOWN'
ELSE [Segment (calc)] END
โปรดทราบว่าสัญลักษณ์ '^' จะใช้ในโซลูชันนี้
ตัวอย่างที่ 3: ENDSWITH
IF ENDSWITH([Segment (calc)],'UNKNOWN')
OR ENDSWITH([Segment (calc)],'LEADER')
OR ENDSWITH([Segment (calc)],'ADVERTISING')
OR ENDSWITH([Segment (calc)],'CLOSED')
OR ENDSWITH([Segment (calc)],'COMPETITOR')
OR ENDSWITH([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
ELSE [Segment (calc)] END
โซลูชัน
IF REGEXP_MATCH([Segment (calc)], '(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)$') THEN 'UNKNOWN'
ELSE [Segment (calc)] END
โปรดทราบว่าสัญลักษณ์ '$' จะใช้ในโซลูชันนี้
ตัวอย่างที่ 3: จัดการสตริงด้วย REGEXP แทน LEFT, MID, RIGHT, FIND, LEN
นิพจน์ทั่วไปก็สามารถเป็นเครื่องมือที่มีประสิทธิภาพได้ เมื่อต้องจัดการกับสตริงที่ซับซ้อน ให้พิจารณาการใช้งานนิพจน์ทั่วไป ในหลายๆ กรณีแสดงให้เห็นว่าการใช้นิพจน์ทั่วไปจะส่งผลให้เกิดการคำนวณที่สั้นลงและมีประสิทธิภาพยิ่งขึ้น หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับนิพจน์ทั่วไป โปรดดู โพสต์ การใช้ regex ปกติและการต่อสู้กับข้อมูลที่ไม่สมบูรณ์(ลิงก์จะเปิดในหน้าต่างใหม่) บนบล็อกของ Tableau
ตัวอย่างที่ 1
ลองสมมติว่าคุณมีการคำนวณต่อไปนี้ให้ลบโปรโตคอลจาก URL ตัวอย่างเช่น: "https://www.tableau.com" เป็น "www.tableau.com"
IF (STARTSWITH([Server], "http://")) THEN
MID([Server], Len("http://") + 1)
ELSEIF(STARTSWITH([Server], "https://")) THEN
MID([Server], Len("https://") + 1)
ELSEIF(STARTSWITH([Server], "tcp:")) THEN
MID([Server], Len("tcp:") + 1)
ELSEIF(STARTSWITH([Server], "\\")) THEN
MID([Server], Len("\\") + 1)
ELSE [Server]
END
โซลูชัน
คุณสามารถลดความซับซ้อนของการคำนวณและเพิ่มประสิทธิภาพได้โดยใช้ฟังก์ชัน REGEXP_REPLACE ได้
REGEXP_REPLACE([Server], "^(http://|https://|tcp:|\\\\)", "")
ตัวอย่างที่ 2
ลองสมมติว่าคุณมีการคำนวณต่อไปนี้ซึ่งส่งกลับส่วนที่สองของที่อยู่ IPv4 ตัวอย่างเช่น: "172.16.0.1" เป็น "16"
IF (FINDNTH([Server], ".", 2) > 0) THEN
MID([Server],
FIND([Server], ".") + 1,
FINDNTH([Server], ".", 2) - FINDNTH([Server], ".", 1) - 1
)
END
โซลูชัน
คุณสามารถลดความซับซ้อนของการคำนวณและเพิ่มประสิทธิภาพได้โดยใช้ฟังก์ชัน REGEXP_EXTRACT ได้
REGEXP_EXTRACT([Server], "\.([^\.]*)\.")
เคล็ดลับที่ 4: อย่าใช้เซ็ตในการคำนวณ
หากคุณใช้เซ็ตในการคำนวณ ให้พิจารณาถึงทางเลือกอื่นแทนโดยให้มีการคำนวณที่เท่าเทียมกัน
ตัวอย่าง
ลองสมมติว่าคุณมีการคำนวณต่อไปนี้ซึ่งใช้เซ็ต Top Customers (set)
IF ISNULL([Customer Name]) OR [Top customers (set)] THEN [Segment] ELSE [Customer Name] END
โซลูชัน 1
หากเซ็ตที่ใช้มีความเรียง่าย คุณก็สามารถสร้างฟิลด์ที่คำนวณซึ่งส่งคืนผลลัพธ์เดียวกันกับเซ็ตได้ ตัวอย่าง:
CASE [Customer Name]
WHEN 'Henry Wilson' THEN True
WHEN 'Jane Johnson' THEN True
WHEN 'Michelle Kim' THEN True
WHEN 'Fred Suzuki' THEN True
WHEN 'Alan Wang' THEN True
ELSE False
END
หมายเหตุ: แนะนำให้ใช้รูปแบบ WHEN TRUE … ELSE ในสถานการณ์นี้เพื่อหลีกเลี่ยงปัญหาด้านประสิทธิภาพเนื่องจากการใช้เซต โดยไม่แนะนำให้ใช้รูปแบบในสถานการณ์ส่วนใหญ่
โซลูชัน 2
หากเซตมีความซับซ้อนยิ่งขึ้น ให้พิจารณาสร้างกลุ่มที่แมปทุกองค์ประกอบในเซตกับค่าหรือแอตทริบิวต์ที่กำหนด เช่น 'IN' แล้วปรับแต่งการคำนวณเพื่อตรวจสอบค่า/แอตทริบิวต์ดังกล่าว ตัวอย่าง:
IF ISNULL([Customer Name]) OR [Top Customers(group)]='IN' THEN [Segment] ELSE [Customer Name] END
หากต้องการข้อมูลเพิ่มเติม โปรดดู จัดกลุ่มข้อมูลของคุณ และ สร้างเซต
เคล็ดลับที่ 5: อย่าใช้เซตเพื่อจัดกลุ่มข้อมูลของคุณ
เซตมีไว้เพื่อเปรียบเทียบสับเซตของข้อมูล กลุ่มมีไว้เพื่อรวมสมาชิกที่เกี่ยวข้องในฟิลด์ ไม่แนะนำให้แปลงเซตเป็นกลุ่มดั่งเช่นในตัวอย่างต่อไปนี้:
IF [Americas Set] THEN "Americas"
ELSEIF [Africa Set] THEN "Africa"
ELSEIF [Asia Set] THEN "Asia"
ELSEIF [Europe Set] THEN "Europe"
ELSEIF [Oceania Set] THEN "Oceania"
ELSE "Unknown"
END
ไม่แนะนำให้ดำเนินการเช่นนี้เนื่องจากเหตุผลหลายประการ:
เซตไม่ได้มีความเป็นเฉพาะตัวเสมอไป สมาชิกบางรายอาจปรากฏอยู่ในหลายๆ เซต ตัวอย่างเช่น รัสเซียอาจอยู่ทั้งในเซตยุโรปและเซตเอเชีย
เซตไม่สามารถแปลงเป็นกลุ่มได้เสมอไป หากกำหนดเซตไว้ด้วยข้อยกเว้น เงื่อนไข หรือข้อจำกัดอาจทำให้ยากหรือแม้กระทั่งเป็นไปไม่ได้ที่จะสร้างกลุ่มที่เท่าเทียมกันขึ้นมาได้
โซลูชัน
จัดกลุ่มข้อมูลของคุณด้วยฟีเจอร์ Group หากต้องการข้อมูลเพิ่มเติม โปรดดู จัดกลุ่มข้อมูลของคุณ