# ภาษาการแบ่งส่วน (Segmentation Language)

Pushwoosh นำเสนอเอนจิ้นการแบ่งส่วนที่มีประสิทธิภาพสำหรับการสร้าง Segment แบบละเอียดตามค่า Tag **Segmentation Language** เป็นวิธีการเฉพาะในการเขียนและรวมเกณฑ์การแบ่งส่วนเพื่ออธิบายกลุ่มผู้ใช้เฉพาะที่ตรงกับเกณฑ์เหล่านั้น และปฏิบัติต่อพวกเขาเป็นกลุ่มเป้าหมายเดียว

บทความนี้อธิบายแนวคิดพื้นฐานและไวยากรณ์ของ Segmentation Language และให้ตัวอย่างที่ครอบคลุมของการสร้างเกณฑ์การแบ่งส่วนสำหรับกรณีต่างๆ

## พื้นฐาน

อุปกรณ์แต่ละเครื่องในฐานผู้ใช้ของคุณมีแอตทริบิวต์เฉพาะที่เชื่อมโยงผ่าน **ค่า Tag**

ตัวอย่างเช่น สมมติว่าผู้ใช้ชื่อ Jane อาศัยอยู่ในโตเกียว และอายุ 28 ปี ผู้ใช้รายนั้นจะมี Tag ต่อไปนี้ตั้งค่าไว้สำหรับอุปกรณ์ของตน:

*   Name: Jane
*   City: Tokyo
*   Age: 28

เพื่อกำหนดเป้าหมาย Jane คุณจะต้องอธิบาย Segment ดังนี้:

`T("Name", eq, "Jane") * T("Age", eq, 28) * T("City", eq, "Tokyo")`

การรวมเงื่อนไขนี้เป็น **นิพจน์ตัวกรอง (filter expression)** ที่ใช้ใน Segmentation Language สำหรับการอธิบายกลุ่มผู้ใช้ หรือที่เรียกว่า Segment ของกลุ่มเป้าหมาย

## นิพจน์ตัวกรอง (Filter expressions)

นิพจน์ตัวกรองคือสตริงที่ประกอบด้วยเงื่อนไขหรือการรวมกันของเงื่อนไขที่อธิบาย Segment ที่คุณต้องการ

### เงื่อนไข (Conditions)

แต่ละเงื่อนไขจะอธิบาย Segment ของอุปกรณ์ที่ตรงกับเกณฑ์ที่ระบุในเงื่อนไขนั้น

ตัวอย่างเช่น เงื่อนไขต่อไปนี้สร้าง Segment ของผู้ใช้ที่อาศัยอยู่ในโตเกียว:

`T("City", e, "Tokyo")`

โดยที่

*   T คือ Tag (ประเภทเงื่อนไข)
*   eq คือโอเปอเรเตอร์ที่จะใช้
*   "Tokyo" คือค่า Tag ที่ผู้ใช้เชื่อมโยงกับอุปกรณ์ของตน

#### ประเภทของเงื่อนไข

ประเภทเงื่อนไขต่อไปนี้พร้อมใช้งานสำหรับการแบ่งส่วน:

*   **A** (Application) – อธิบาย Segment ของอุปกรณ์ที่มีแอปพลิเคชันเฉพาะติดตั้งอยู่ ชื่อพ้อง: **App**, **Application**
*   **T** (Tag) – อธิบาย Segment ของอุปกรณ์ที่มีค่า Tag ที่ระบุ
*   **AT** (App-scoped tag) – ค้นหาค่า Tag ภายในแอปพลิเคชันเฉพาะ ต้องใช้รหัสแอปเป็นอาร์กิวเมนต์แรก ชื่อพ้อง: **Tag**
*   **Event** – อธิบาย Segment ของอุปกรณ์ที่ทริกเกอร์ Event เฉพาะของ Pushwoosh
*   **Geo** – อธิบาย Segment ของอุปกรณ์ภายในรัศมีทางภูมิศาสตร์ที่เฉพาะเจาะจง
*   **BTTS** – อธิบาย Segment ของอุปกรณ์ตามเวลาที่ดีที่สุดในการส่ง (best time to send)
*   **Updated** – อธิบาย Segment ของอุปกรณ์ตามการประทับเวลาอัปเดตล่าสุด
*   **Segment** – อ้างอิงตัวกรอง/Segment อื่นตามรหัส

### การดำเนินการกับเงื่อนไข

สำหรับการสร้าง Segment ที่ซับซ้อน สามารถใช้การดำเนินการต่อไปนี้กับเงื่อนไขภายในนิพจน์ตัวกรองได้:

#### ยูเนียน (+) (Union)

เข้าร่วม Segment ต่างๆ เช่น สร้าง Segment ใหม่ของผู้ใช้ที่ตรงตามเงื่อนไขที่ระบุอย่างน้อยหนึ่งเงื่อนไข

<img src="/filters-segmentation-language-1.webp" alt=""/>

ตัวอย่างเช่น เพื่อกำหนดเป้าหมายผู้ใช้ที่อาศัยอยู่ในโตเกียวหรือโอซาก้า คุณจะต้องอธิบาย Segment ด้วยเงื่อนไขต่อไปนี้:

`T("City", eq, "Tokyo") + T("City", eq, "Osaka")`

<Aside type="note">
เทียบเท่ากับการเลือกทางตรรกะ **(OR)** สามารถเขียนเป็นโอเปอเรเตอร์ **or** ได้เช่นกัน
</Aside>

#### อินเตอร์เซกชัน (*) (Intersection)

สร้าง Segment ของผู้ใช้ที่เป็นของทั้งสอง Segment ที่อธิบายโดยเงื่อนไข ดังนั้น จะรวมเฉพาะผู้ใช้ที่ปฏิบัติตามแต่ละเงื่อนไขที่คุณระบุเท่านั้น

<img src="/filters-segmentation-language-2.webp" alt=""/>

นิพจน์ต่อไปนี้อธิบาย Segment ของผู้ใช้ที่อาศัยอยู่ในโตเกียวและได้ระบุชื่อของตน:

`T("City", eq, "Tokyo") * T("Name", any)`

<Aside type="note">
คล้ายกับการเชื่อมทางตรรกะ **(AND)** สามารถเขียนเป็นโอเปอเรเตอร์ **and** ได้เช่นกัน
</Aside>

#### ผลต่าง (\\) (Difference)

สร้าง Segment ของผู้ใช้ที่เป็นของหนึ่งใน Segment ที่อธิบายและไม่ได้เป็นของอีก Segment หนึ่ง

<img src="/filters-segmentation-language-3.webp" alt=""/>

ผู้ใช้ที่อาศัยอยู่ในโตเกียวแต่ไม่ได้ให้ชื่อแก่คุณจะถูกอธิบายดังนี้:

`T("City", eq, "Tokyo") \ T("Name", any)`

<Aside type="note">
เทียบเท่ากับการปฏิเสธทางตรรกะ **(NOT)** สามารถเขียนเป็นโอเปอเรเตอร์ **not** ได้เช่นกัน
</Aside>

#### วงเล็บ (Parentheses)

กำหนดลำดับของการดำเนินการที่จะทำกับเงื่อนไขในนิพจน์ตัวกรองของคุณ

ตัวอย่างเช่น นิพจน์ตัวกรองต่อไปนี้จะได้รับ Segment ของผู้สมัครสมาชิก 12345-67890 ที่มีอายุ 18 ปีก่อน จากนั้นจึงลบผู้ชายทั้งหมดของ Segment นั้นออก:

`( A("12345-67890") * T("Age", eq, 18) ) \ T("Gender", eq, "Male")`

## โอเปอเรเตอร์สำหรับเงื่อนไข Tag

สำหรับ Tag แต่ละประเภท จะมีการใช้โอเปอเรเตอร์ของตัวเอง

### โอเปอเรเตอร์สำหรับ Tag ประเภท Integer

*   **eq** - เท่ากับค่าที่ระบุ
*   **noteq** - ไม่เท่ากับค่าที่ระบุ
*   **lte** - น้อยกว่าหรือเท่ากับค่าที่ระบุ
*   **gte** - มากกว่าหรือเท่ากับค่าที่ระบุ
*   **in** - ค่าใดค่าหนึ่งที่ระบุ
*   **notin** - ไม่เท่ากับค่าใดๆ ที่ระบุ
*   **between** - อยู่ในช่วงที่ระบุ
*   **any** - อุปกรณ์ที่มีค่าใดๆ ตั้งไว้สำหรับ Tag
*   **notset** - อุปกรณ์ที่ไม่มีค่าตั้งไว้สำหรับ Tag

<Aside type="note" title="ตัวอย่างไวยากรณ์สำหรับ Tag ประเภท Integer">
`T("int", eq, 42)`
</Aside>

### โอเปอเรเตอร์สำหรับ Tag ประเภท String

*   **eq** - เท่ากับค่าที่ระบุ
*   **noteq** - ไม่เท่ากับค่าที่ระบุ
*   **startswith** - ขึ้นต้นด้วยคำนำหน้าที่ระบุ
*   **endswith** - ลงท้ายด้วยคำต่อท้ายที่ระบุ
*   **contains** - มีสตริงย่อยที่ระบุ
*   **in** - เท่ากับค่าใดค่าหนึ่งที่ระบุ
*   **notin** - ไม่เท่ากับค่าใดๆ ที่ระบุ
*   **any** - อุปกรณ์ที่มีค่าใดๆ ตั้งไว้สำหรับ Tag
*   **notset** - อุปกรณ์ที่ไม่มีค่าตั้งไว้สำหรับ Tag

<Aside type="note" title="ตัวอย่างไวยากรณ์สำหรับ Tag ประเภท String">
* `T("str", eq, "kangaroo")` - ตรงกันทุกประการ
* `T("str", startswith, "kang")` - ขึ้นต้นด้วย "kang"
* `T("str", endswith, "roo")` - ลงท้ายด้วย "roo"
* `T("str", contains, "nga")` - มี "nga" อยู่ที่ใดก็ได้ในสตริง
</Aside>

### โอเปอเรเตอร์สำหรับ Tag ประเภท List

*   **in** - อุปกรณ์ที่มีค่า Tag ใดๆ ที่ระบุ
*   **notin** - ไม่มีค่า Tag ใดๆ ที่ระบุเชื่อมโยงกับอุปกรณ์
*   **any** - อุปกรณ์ที่มีค่าใดๆ ตั้งไว้สำหรับ Tag
*   **notset** - อุปกรณ์ที่ไม่มีค่าตั้งไว้สำหรับ Tag

<Aside type="note" title="ตัวอย่างไวยากรณ์สำหรับ Tag ประเภท List">
`T("list", notin, ["kangaroo", "raccoon"])`
</Aside>

### โอเปอเรเตอร์สำหรับ Tag ประเภท Date

*   **eq** - เท่ากับวันที่ที่ระบุ
*   **noteq** - ไม่เท่ากับวันที่ที่ระบุ
*   **lte** - ก่อนหรือในวันที่ที่ระบุ
*   **gte** - หลังหรือในวันที่ที่ระบุ
*   **in** - เท่ากับวันที่ใดๆ ที่ระบุ
*   **notin** - ไม่เท่ากับวันที่ใดๆ ที่ระบุ
*   **between** - อยู่ในช่วงที่ระบุ
*   **any** - อุปกรณ์ที่มีค่าใดๆ ตั้งไว้สำหรับ Tag
*   **notset** - อุปกรณ์ที่ไม่มีค่าตั้งไว้สำหรับ Tag
*   **match** - ตรงกับเดือนของปีและวันที่ของเดือนที่ระบุ

<Aside type="note" title="ตัวอย่างโอเปอเรเตอร์ match">


* `AT("XXXXX-XXXXX", "Date tag", match month 4 day 1)` - อุปกรณ์ที่มี "Date tag" ตั้งค่าเป็นวันที่ 1 เมษายนของปีใดก็ได้
* `AT("XXXXX-XXXXX", "Date tag", match month "now" day 13)` - อุปกรณ์ที่มี "Date tag" ตั้งค่าเป็นวันที่ 13 ของเดือนปัจจุบัน
* `AT("XXXXX-XXXXX", "Date tag", match month "now" day "now+2")` - อุปกรณ์ที่มี "Date tag" ตั้งค่าเป็นวันมะรืนนี้ กรณีการใช้งานทั่วไป: การอวยพรวันเกิด
</Aside>

<Aside type="note" title="ตัวอย่างโอเปอเรเตอร์ Match สำหรับ Segment วันครบรอบและวันเกิด">
คุณสามารถ [แบ่งส่วนผู้ใช้ตามวันที่ในปฏิทินที่เกิดซ้ำ](/th/product/audience-data-and-segmentation/segmentation/create-segments/anniversary-segments) เช่น วันเกิดหรือวันครบรอบ ในกรณีเหล่านี้ จะพิจารณาเฉพาะเดือนและวันเท่านั้น โดยไม่สนใจปี

* `AT("XXXXX-XXXXX", "birthday", match month "now" day "now")`
   **กำหนดเป้าหมายผู้ใช้ที่มีวันเกิดในวันนี้** (วันและเดือนเดียวกับวันนี้)
   *ใช้สิ่งนี้เพื่อส่งคำอวยพรวันเกิดหรือข้อเสนอพิเศษในวันเกิดจริงของผู้ใช้*

* `AT("XXXXX-XXXXX", "birthday", match month "now" day "now+N")`
   **กำหนดเป้าหมายผู้ใช้ที่มีวันเกิดในอีก N วัน** (เดือนและวันเดียวกัน N วันนับจากวันนี้)
   *ใช้สิ่งนี้เพื่อเตรียมผู้ใช้ล่วงหน้า เช่น ส่งข้อความนับถอยหลังหรือการแจ้งเตือนกิจกรรมที่จะเกิดขึ้น*

* `AT("XXXXX-XXXXX", "birthday", match month "now" day "now-N")`
   **กำหนดเป้าหมายผู้ใช้ที่มีวันเกิดเมื่อ N วันที่แล้ว**
   *ใช้สิ่งนี้สำหรับข้อความวันเกิดย้อนหลังหรือการติดตามผล เช่น การขอความคิดเห็น*
* `AT("XXXXX-XXXXX", "birthday", match month "now" day N)`
   **กำหนดเป้าหมายผู้ใช้ที่มีวันเกิดในวันที่ N ของเดือนปัจจุบัน** โดยไม่คำนึงถึงปี
   *ใช้สิ่งนี้เมื่อวางแผนแคมเปญรายเดือนที่ผูกกับวันที่เฉพาะเจาะจง (เช่น รางวัลความภักดีรายเดือนในวันที่ 10)*
</Aside>

*   **daysago eq** - เท่ากับจำนวนวันที่ระบุก่อนวันปัจจุบัน
*   **daysago noteq** - ไม่เท่ากับจำนวนวันที่ระบุก่อนวันปัจจุบัน
*   **daysago lte** - น้อยกว่าหรือเท่ากับจำนวนวันที่ระบุก่อนวันปัจจุบัน
*   **daysago gte** - มากกว่าหรือเท่ากับจำนวนวันที่ระบุก่อนวันปัจจุบัน
*   **daysago between** - ระหว่างจำนวนวันที่ระบุ

<Aside type="note" title="ตัวอย่างโอเปอเรเตอร์ daysago">

* `T("Date tag", daysago, eq, 0)` - วันปัจจุบันตั้งแต่ 00:00 น. ถึงช่วงเวลาปัจจุบัน
* `T("Date tag", daysago, eq, 1)` - ตั้งแต่ 00:00 น. ของวันก่อนหน้าถึง 00:00 น. ของวันปัจจุบัน
* `T("Date tag", daysago, gte, 1)` - ตลอดเวลาจนถึง 00:00 น. ของวันปัจจุบัน
* `T("Date tag", daysago, lte, 7)` - ตั้งแต่ 00:00 น. ของวันที่ 6 วันที่แล้วถึงช่วงเวลาปัจจุบัน
* `T("Date tag", daysago, between, [2,7])` - ตั้งแต่ 7 ถึง 2 วันที่แล้ว
</Aside>

*   **minutesago lte** - น้อยกว่าหรือเท่ากับจำนวนนาทีที่ระบุก่อนช่วงเวลาปัจจุบัน
*   **minutesago gte** - มากกว่าหรือเท่ากับจำนวนนาทีที่ระบุก่อนช่วงเวลาปัจจุบัน

<Aside type="note" title="ตัวอย่างโอเปอเรเตอร์ minutesago">

* `T("Date tag", minutesago, lte, 30)` - 30 นาทีล่าสุด
* `T("Date tag", minutesago, gte, 60)` - 60 นาทีหรือมากกว่านั้น
* `T("Date tag", minutesago, lte, 1)` - ภายในนาทีล่าสุด
</Aside>

*   **daysahead** - ใน N ถึง M วันนับจากวันปัจจุบัน (UTC) รวมทั้งสองด้าน

<Aside type="note" title="ตัวอย่างโอเปอเรเตอร์ daysahead">

`daysahead` รับช่วงเวลา `[from, to]` (วันนับจากเที่ยงคืน UTC ของวันนี้ รวมทั้งสองด้าน) ซึ่งแตกต่างจาก `daysago` ตรงที่ไม่มีโอเปอเรเตอร์ย่อย — มีเพียงรูปแบบช่วงเวลาเท่านั้น

* `T("Date tag", daysahead, [0, 0])` - วันปัจจุบันตั้งแต่ 00:00 ถึง 23:59:59
* `T("Date tag", daysahead, [1, 1])` - วันถัดไปตั้งแต่ 00:00 ถึง 23:59:59
* `T("Date tag", daysahead, [2, 5])` - ช่วงเวลาใดก็ได้ตั้งแต่เริ่มต้น 2 วันนับจากนี้จนถึงสิ้นสุด 5 วันนับจากนี้
</Aside>

<Aside type="note" title="ตัวอย่างโอเปอเรเตอร์ date">
* `T("Date tag", eq "2022-12-05 00:00:00")`
</Aside>

### โอเปอเรเตอร์สำหรับ Tag ประเภท Boolean

*   **eq** - เท่ากับค่าที่ระบุ
*   **noteq** - ไม่เท่ากับค่าที่ระบุ
*   **any** - อุปกรณ์ที่มีค่าใดๆ ตั้งไว้สำหรับ Tag
*   **notset** - อุปกรณ์ที่ไม่มีค่าตั้งไว้สำหรับ Tag

<Aside type="note" title="ตัวอย่างไวยากรณ์สำหรับ Tag ประเภท Boolean">
 `T("bool", eq, true)`
</Aside>

### โอเปอเรเตอร์สำหรับ Tag ประเภท Price

*   **eq** - เท่ากับค่าที่ระบุ
*   **noteq** - ไม่เท่ากับค่าที่ระบุ
*   **lte** - น้อยกว่าหรือเท่ากับค่าที่ระบุ
*   **gte** - มากกว่าหรือเท่ากับค่าที่ระบุ
*   **in** - เท่ากับค่าใดค่าหนึ่งที่ระบุ
*   **notin** - ไม่เท่ากับค่าใดๆ ที่ระบุ
*   **between** - อยู่ในช่วงที่ระบุ
*   **any** - อุปกรณ์ที่มีค่าใดๆ ตั้งไว้สำหรับ Tag
*   **notset** - อุปกรณ์ที่ไม่มีค่าตั้งไว้สำหรับ Tag

<Aside type="note" title="ตัวอย่างไวยากรณ์สำหรับ Tag ประเภท Price">
`T("price", between, ["4.2", "6.9"])`
</Aside>

### โอเปอเรเตอร์สำหรับ Tag ประเภท Version

*   **eq** - เท่ากับค่าที่ระบุ
*   **noteq** - ไม่เท่ากับค่าที่ระบุ
*   **lte** - น้อยกว่าหรือเท่ากับค่าที่ระบุ
*   **gte** - มากกว่าหรือเท่ากับค่าที่ระบุ
*   **in** - เท่ากับค่าใดค่าหนึ่งที่ระบุ
*   **notin** - ไม่เท่ากับค่าใดๆ ที่ระบุ
*   **between** - อยู่ในช่วงที่ระบุ
*   **any** - อุปกรณ์ที่มีค่าใดๆ ตั้งไว้สำหรับ Tag
*   **notset** - อุปกรณ์ที่ไม่มีค่าตั้งไว้สำหรับ Tag

<Aside type="note" title="ตัวอย่างไวยากรณ์สำหรับ Tag ประเภท Version">
`T("version", lte, "4.2")`
</Aside>

## โอเปอเรเตอร์สำหรับเงื่อนไข Event

<Aside type="note">
โปรดทราบว่าเงื่อนไข Event เป็นแบบเฉพาะแอป ดังนั้นควรระบุรหัสแอปในนิพจน์ตัวกรองของคุณพร้อมกับชื่อ Event
</Aside>

### จำนวน Event

*   **count gte** - อุปกรณ์ที่ทริกเกอร์ Event มากกว่าหรือเท่ากับ n ครั้ง
*   **count lte** - อุปกรณ์ที่ทริกเกอร์ Event น้อยกว่าหรือเท่ากับ n ครั้ง
*   **count eq** - อุปกรณ์ที่ทริกเกอร์ Event เท่ากับ n ครั้งพอดี
*   **count noteq** - อุปกรณ์ที่ทริกเกอร์ Event กี่ครั้งก็ได้แต่ไม่เท่ากับ n

<Aside type="note" title="ตัวอย่างไวยากรณ์จำนวน Event">
 `Event("11111-11111", "Level reached", count gte 10) // 11111-11111 คือรหัสแอป`
</Aside>

### วันที่ของ Event

*   **date gte** - อุปกรณ์ที่ทริกเกอร์ Event ช้ากว่าหรือตรงกับวันที่ที่ระบุ
*   **date lte** - อุปกรณ์ที่ทริกเกอร์ Event เร็วกว่าหรือตรงกับวันที่ที่ระบุ
*   **date eq** - อุปกรณ์ที่ทริกเกอร์ Event ตรงกับวันที่ที่ระบุพอดี
*   **date noteq** - อุปกรณ์ที่ทริกเกอร์ Event เมื่อใดก็ได้แต่ไม่ใช่ในวันที่ที่ระบุ
*   **date in** - อุปกรณ์ที่ทริกเกอร์ Event ในวันที่ใดๆ ที่ระบุ
*   **date notin** - อุปกรณ์ที่ทริกเกอร์ Event เมื่อใดก็ได้แต่ไม่ใช่ในวันที่ใดๆ ที่ระบุ
*   **date between** - อุปกรณ์ที่ทริกเกอร์ Event ภายในช่วงเวลาที่ระบุ
*   **date daysago eq** - วันที่ทริกเกอร์ Event เท่ากับจำนวนวันที่ระบุก่อนวันปัจจุบัน
*   **date daysago noteq** - วันที่ทริกเกอร์ Event ไม่เท่ากับจำนวนวันที่ระบุก่อนวันปัจจุบัน
*   **date daysago lte** - วันที่ทริกเกอร์ Event น้อยกว่าหรือเท่ากับจำนวนวันที่ระบุก่อนวันปัจจุบัน
*   **date daysago gte** - วันที่ทริกเกอร์ Event มากกว่าหรือเท่ากับจำนวนวันที่ระบุก่อนวันปัจจุบัน
*   **date daysago between** - วันที่ทริกเกอร์ Event อยู่ระหว่างจำนวนวันที่ระบุ
*   **date daysahead** - วันที่ทริกเกอร์ Event อยู่ในจำนวนวันที่ระบุจากวันปัจจุบัน (ช่วงเวลารวมทั้งสองด้าน ดูโอเปอเรเตอร์สำหรับ Tag ประเภท Date ด้านบนสำหรับความหมายทั้งหมด)
*   **date minutesago lte** - วันที่ทริกเกอร์ Event น้อยกว่าหรือเท่ากับจำนวนนาทีที่ระบุก่อนช่วงเวลาปัจจุบัน
*   **date minutesago gte** - วันที่ทริกเกอร์ Event มากกว่าหรือเท่ากับจำนวนนาทีที่ระบุก่อนช่วงเวลาปัจจุบัน

<Aside type="note" title="ตัวอย่างไวยากรณ์วันที่ของ Event">

- `Event("11111-11111", "Level reached", date gte "2022-01-01 01:02:03")`
- `Event("11111-11111", "Level reached", date in ["2022-01-01 01:02:03", "2022-01-01 02:03:04"])`
- `Event("11111-11111", "Level reached", date between "2022-01-01 01:02:03" "2022-01-01 02:03:04")`
- `Event("11111-11111", "Level reached", date daysahead 0 7)` - Event ที่มีวันที่ทริกเกอร์ภายใน 7 วันข้างหน้า
- `Event("11111-11111", "Level reached", date minutesago lte 30)` - Event ภายใน 30 นาทีล่าสุด
- `Event("11111-11111", "Level reached", date minutesago gte 60)` - Event เมื่อ 60+ นาทีที่แล้ว

</Aside>

### แพลตฟอร์มของ Event

กรอง Event ตามแพลตฟอร์มที่ถูกทริกเกอร์

*   **platforms** - รายการแพลตฟอร์ม (เช่น ["ios", "android"])

<Aside type="note" title="ตัวอย่างไวยากรณ์แพลตฟอร์มของ Event">
`Event("11111-11111", "Level reached", platforms ["android", "ios"], count gte 5)`
</Aside>

### แอตทริบิวต์ของ Event

เงื่อนไข Event สามารถกรองตามค่าแอตทริบิวต์ของ Event ได้ แอตทริบิวต์รองรับประเภทข้อมูลต่างๆ พร้อมโอเปอเรเตอร์ที่สอดคล้องกัน

#### แอตทริบิวต์ของ Event ประเภท Integer

*   **attribute "name" eq** - แอตทริบิวต์เท่ากับค่าที่ระบุ
*   **attribute "name" noteq** - แอตทริบิวต์ไม่เท่ากับค่าที่ระบุ
*   **attribute "name" gte** - แอตทริบิวต์มากกว่าหรือเท่ากับค่าที่ระบุ
*   **attribute "name" lte** - แอตทริบิวต์น้อยกว่าหรือเท่ากับค่าที่ระบุ
*   **attribute "name" between** - แอตทริบิวต์อยู่ในช่วงที่ระบุ
*   **attribute "name" in** - แอตทริบิวต์เท่ากับค่าใดๆ ที่ระบุ
*   **attribute "name" notin** - แอตทริบิวต์ไม่เท่ากับค่าใดๆ ที่ระบุ
*   **attribute "name" any** - มีค่าใดๆ ตั้งไว้สำหรับแอตทริบิวต์
*   **attribute "name" notset** - ไม่มีค่าตั้งไว้สำหรับแอตทริบิวต์

<Aside type="note" title="ตัวอย่างไวยากรณ์แอตทริบิวต์ประเภท Integer">

* `Event("11111-11111", "Purchase", attribute "amount" eq 42)`
* `Event("11111-11111", "Purchase", attribute "amount" between 10 100)`
* `Event("11111-11111", "Purchase", attribute "amount" in [10, 20, 30])`

</Aside>

#### แอตทริบิวต์ของ Event ประเภท String

*   **attribute "name" eq** - แอตทริบิวต์เท่ากับค่าที่ระบุ
*   **attribute "name" noteq** - แอตทริบิวต์ไม่เท่ากับค่าที่ระบุ
*   **attribute "name" startswith** - แอตทริบิวต์ขึ้นต้นด้วยคำนำหน้าที่ระบุ
*   **attribute "name" endswith** - แอตทริบิวต์ลงท้ายด้วยคำต่อท้ายที่ระบุ
*   **attribute "name" contains** - แอตทริบิวต์มีสตริงย่อยที่ระบุ
*   **attribute "name" in** - แอตทริบิวต์เท่ากับค่าใดๆ ที่ระบุ
*   **attribute "name" notin** - แอตทริบิวต์ไม่เท่ากับค่าใดๆ ที่ระบุ
*   **attribute "name" any** - มีค่าใดๆ ตั้งไว้สำหรับแอตทริบิวต์
*   **attribute "name" notset** - ไม่มีค่าตั้งไว้สำหรับแอตทริบิวต์

<Aside type="note" title="ตัวอย่างไวยากรณ์แอตทริบิวต์ประเภท String">

* `Event("11111-11111", "Page View", attribute "url" startswith "https://example.com")`
* `Event("11111-11111", "Page View", attribute "url" endswith ".html")`
* `Event("11111-11111", "Page View", attribute "url" contains "/products/")`
* `Event("11111-11111", "Button Click", attribute "button_name" in ["submit", "cancel"])`

</Aside>

#### แอตทริบิวต์ของ Event ประเภท Boolean

*   **attribute "name" eq** - แอตทริบิวต์เท่ากับ true หรือ false
*   **attribute "name" noteq** - แอตทริบิวต์ไม่เท่ากับ true หรือ false

<Aside type="note" title="ตัวอย่างไวยากรณ์แอตทริบิวต์ประเภท Boolean">
`Event("11111-11111", "Feature Toggle", attribute "enabled" eq true)`
</Aside>

#### แอตทริบิวต์ของ Event ประเภท Date

*   **attribute "name" eq** - แอตทริบิวต์เท่ากับวันที่ที่ระบุ
*   **attribute "name" noteq** - แอตทริบิวต์ไม่เท่ากับวันที่ที่ระบุ
*   **attribute "name" gte** - แอตทริบิวต์หลังหรือในวันที่ที่ระบุ
*   **attribute "name" lte** - แอตทริบิวต์ก่อนหรือในวันที่ที่ระบุ
*   **attribute "name" between** - แอตทริบิวต์อยู่ในช่วงวันที่ที่ระบุ
*   **attribute "name" in** - แอตทริบิวต์เท่ากับวันที่ใดๆ ที่ระบุ
*   **attribute "name" notin** - แอตทริบิวต์ไม่เท่ากับวันที่ใดๆ ที่ระบุ
*   **attribute "name" daysago eq/noteq/gte/lte/between** - แอตทริบิวต์สัมพันธ์กับจำนวนวันที่ผ่านมา
*   **attribute "name" daysahead from to** - แอตทริบิวต์อยู่ในช่วงวันที่ระบุจากวันปัจจุบัน (ช่วงเวลารวมทั้งสองด้าน ดูโอเปอเรเตอร์สำหรับ Tag ประเภท Date ด้านบนสำหรับความหมายทั้งหมด)
*   **attribute "name" minutesago gte/lte** - แอตทริบิวต์สัมพันธ์กับจำนวนนาทีที่ผ่านมา
*   **attribute "name" any** - มีค่าใดๆ ตั้งไว้สำหรับแอตทริบิวต์
*   **attribute "name" notset** - ไม่มีค่าตั้งไว้สำหรับแอตทริบิวต์

<Aside type="note" title="ตัวอย่างไวยากรณ์แอตทริบิวต์ประเภท Date">

* `Event("11111-11111", "Subscription", attribute "start_date" eq "2022-01-01 01:02:03")`
* `Event("11111-11111", "Subscription", attribute "start_date" between "2022-01-01 00:00:00" "2022-12-31 23:59:59")`
* `Event("11111-11111", "Subscription", attribute "start_date" daysago lte 30)` - ภายใน 30 วันล่าสุด
* `Event("11111-11111", "Subscription", attribute "renewal_at" daysahead 0 30)` - การต่ออายุใน 30 วันข้างหน้า
* `Event("11111-11111", "Subscription", attribute "start_date" minutesago gte 60)` - 60+ นาทีที่แล้ว

</Aside>

#### แอตทริบิวต์ของ Event ประเภท Price

*   **attribute "name" eq** - แอตทริบิวต์เท่ากับค่าราคาที่ระบุ
*   **attribute "name" noteq** - แอตทริบิวต์ไม่เท่ากับค่าราคาที่ระบุ
*   **attribute "name" gte** - แอตทริบิวต์มากกว่าหรือเท่ากับราคาที่ระบุ
*   **attribute "name" lte** - แอตทริบิวต์น้อยกว่าหรือเท่ากับราคาที่ระบุ
*   **attribute "name" between** - แอตทริบิวต์อยู่ในช่วงราคาที่ระบุ
*   **attribute "name" in** - แอตทริบิวต์เท่ากับราคาใดๆ ที่ระบุ
*   **attribute "name" notin** - แอตทริบิวต์ไม่เท่ากับราคาใดๆ ที่ระบุ
*   **attribute "name" any** - มีค่าใดๆ ตั้งไว้สำหรับแอตทริบิวต์
*   **attribute "name" notset** - ไม่มีค่าตั้งไว้สำหรับแอตทริบิวต์

<Aside type="note" title="ตัวอย่างไวยากรณ์แอตทริบิวต์ประเภท Price">
`Event("11111-11111", "Purchase", attribute "total_price" between 10.00 50.00)`
</Aside>

#### แอตทริบิวต์ของ Event ประเภท List

*   **attribute "name" in** - แอตทริบิวต์มีค่าใดๆ ที่ระบุ
*   **attribute "name" notin** - แอตทริบิวต์ไม่มีค่าใดๆ ที่ระบุ
*   **attribute "name" any** - มีค่าใดๆ ตั้งไว้สำหรับแอตทริบิวต์
*   **attribute "name" notset** - ไม่มีค่าตั้งไว้สำหรับแอตทริบิวต์

<Aside type="note" title="ตัวอย่างไวยากรณ์แอตทริบิวต์ประเภท List">
`Event("11111-11111", "Cart Update", attribute "product_ids" in ["prod-123", "prod-456"])`
</Aside>

## ประเภทเงื่อนไขเพิ่มเติม

### เงื่อนไข Geo

กำหนดเป้าหมายอุปกรณ์ตามตำแหน่งทางภูมิศาสตร์ภายในรัศมีที่ระบุ

**ไวยากรณ์:** `Geo("<app-code>", <latitude>, <longitude>, <range-in-km>)`

<Aside type="note" title="ตัวอย่างไวยากรณ์ Geo">
`Geo("11111-11111", 53.2734, -7.77832031, 100.05)` - อุปกรณ์ภายในระยะ 100.05 กม. จากพิกัด
</Aside>

### เงื่อนไข BTTS

กำหนดเป้าหมายอุปกรณ์ตามเวลาที่ดีที่สุดในการส่งการแจ้งเตือน (ชั่วโมงของวัน, 0-23)

**โอเปอเรเตอร์:**
*   **any** - มีค่าเวลาที่ดีที่สุดในการส่งใดๆ ตั้งไว้
*   **eq** - ตรงกับชั่วโมงที่แน่นอน
*   **noteq** - ไม่เท่ากับชั่วโมง
*   **gte** - ชั่วโมงมากกว่าหรือเท่ากับ
*   **lte** - ชั่วโมงน้อยกว่าหรือเท่ากับ

<Aside type="note" title="ตัวอย่างไวยากรณ์ BTTS">

* `BTTS("11111-11111", eq 10)` - อุปกรณ์ที่มีเวลาที่ดีที่สุดเวลา 10:00 น.
* `BTTS("11111-11111", gte 18)` - อุปกรณ์ที่มีเวลาที่ดีที่สุดตั้งแต่ 18:00 น. เป็นต้นไป
* `BTTS("11111-11111", any)` - อุปกรณ์ที่มีค่าเวลาที่ดีที่สุดใดๆ

</Aside>

### เงื่อนไข Updated

กรองอุปกรณ์ตามการประทับเวลาอัปเดตล่าสุด

**โอเปอเรเตอร์:**
*   **gte** - อัปเดตหลังหรือในวันที่ที่ระบุ
*   **lte** - อัปเดตก่อนหรือในวันที่ที่ระบุ
*   **between** - อัปเดตภายในช่วงวันที่

<Aside type="note" title="ตัวอย่างไวยากรณ์ Updated">

* `Updated("11111-11111", gte "2022-01-01 00:00:00")` - อุปกรณ์ที่อัปเดตหลังวันที่ 1 ม.ค. 2022
* `Updated("11111-11111", lte "2022-12-31 23:59:59")` - อุปกรณ์ที่อัปเดตก่อนวันที่ 31 ธ.ค. 2022
* `Updated("11111-11111", between "2022-01-01 00:00:00" "2022-12-31 23:59:59")` - อุปกรณ์ที่อัปเดตในปี 2022

</Aside>

### เงื่อนไข Segment

อ้างอิงตัวกรอง/Segment อื่นตามรหัส

<Aside type="note" title="ตัวอย่างไวยากรณ์ Segment">
`Segment("11111-11111", "22222-22222")` - อ้างอิงตัวกรองด้วยรหัส "22222-22222"
</Aside>

## แฟล็กการมีอยู่ของอุปกรณ์ในเงื่อนไข Application

เงื่อนไข Application รองรับแฟล็กเพิ่มเติมเพื่อควบคุมการกรองอุปกรณ์และโทเค็น:

*   **with_tokens** - อุปกรณ์ที่มีโทเค็นการแจ้งเตือนแบบพุช
*   **without_tokens** - อุปกรณ์ที่ไม่มีโทเค็นการแจ้งเตือนแบบพุช
*   **with_devices** - ผู้ใช้ที่มีอุปกรณ์ที่ลงทะเบียน
*   **without_devices** - ผู้ใช้/โปรไฟล์ที่ไม่มีอุปกรณ์ที่ลงทะเบียน

<Aside type="note" title="ตัวอย่างไวยากรณ์แฟล็ก Application">

* `A("11111-11111", ["ios", "android"], [with_tokens])` - อุปกรณ์ที่มีโทเค็นพุช
* `A("11111-11111", ["ios", "android"], [without_tokens])` - อุปกรณ์ที่ไม่มีโทเค็นพุช
* `A("11111-11111", [], [with_devices])` - อุปกรณ์ทั้งหมดที่มีบันทึกอุปกรณ์
* `A("11111-11111", ["ios", "android"], [without_tokens, with_devices])` - อุปกรณ์ที่ไม่มีโทเค็นแต่มีบันทึกอุปกรณ์

</Aside>

## ตัวอย่างนิพจน์ตัวกรอง

<Aside type="note">
เมื่อเขียนคิวรี JSON อย่าลืม escape เครื่องหมายคำพูด (`"`) และ backslash (`\`) ด้วย backslash (`\`)
สำหรับตัวอย่างคำขอ ดูที่ [/exportSegment](/th/developer/api-reference/segmentation-filters-api/#exportsegment)
</Aside>

### ตัวอย่างพื้นฐาน

1.  อุปกรณ์ iOS และ Android ที่ติดตั้งแอปและมีโทเค็นพุช:

```json
A("11111-11111", ["ios","android"], [with_tokens])
```

2.  อุปกรณ์ iOS และ Android ที่ติดตั้งแอปแต่ไม่มีโทเค็นพุช:

```json
A("11111-11111", ["ios","android"], [without_tokens])
```

3.  อุปกรณ์ iOS และ Android ที่ติดตั้งแอป ไม่ว่าจะมีโทเค็นพุชหรือไม่:

```json
A("11111-11111", ["ios","android"], [with_tokens, without_tokens])
```

4.  ผู้สมัครสมาชิกแอปทั้งหมดที่ซื้อของในแอป:

```json
AT("11111-11111", "In-App Purchase", gte, 1)
```

### ตัวอย่างขั้นสูง

5.  ผู้ใช้ในโตเกียวที่เปิดแอปใน 7 วันล่าสุด:

```json
T("City", eq, "Tokyo") * Event("11111-11111", "App Open", date daysago lte 7)
```

6.  ผู้ใช้ที่ซื้อของมูลค่ากว่า $50 ใน 30 วันล่าสุด:

```json
Event("11111-11111", "Purchase", attribute "total_price" gte 50.00, date daysago lte 30)
```

7.  ผู้ใช้ที่ชื่อขึ้นต้นด้วย "J" หรือลงท้ายด้วย "e":

```json
T("Name", startswith, "J") + T("Name", endswith, "e")
```

8.  ผู้ใช้ iOS ที่ใช้งานอยู่ภายในระยะ 100 กม. จากนิวยอร์กที่ไม่ได้ซื้อของเมื่อเร็วๆ นี้:

```json
A("11111-11111", ["ios"], [with_tokens]) * Geo("11111-11111", 40.7128, -74.0060, 100) \ Event("11111-11111", "Purchase", date daysago lte 30)
```

9.  ผู้ใช้ที่มีเวลาที่ดีที่สุดในการส่งระหว่าง 9.00 น. ถึง 17.00 น.:

```json
BTTS("11111-11111", gte 9) * BTTS("11111-11111", lte 17)
```

10. ผู้ใช้ที่ทริกเกอร์ Event เฉพาะบน Android หรือ iOS ในชั่วโมงล่าสุด:

```json
Event("11111-11111", "Button Click", platforms ["android", "ios"], date minutesago lte 60)
```

11. อุปกรณ์ที่อัปเดตใน 3 เดือนล่าสุดด้วยแอปเวอร์ชัน 4.2 หรือสูงกว่า:

```json
Updated("11111-11111", gte "2024-07-01 00:00:00") * AT("11111-11111", "App Version", gte, "4.2")
```