changed
changed, process
def process changed(value: any): boolean
Returns true if the current value is different from the previous value; always returns true for the first element. This process function must be used with either scan or sort ordering option.
value: The value to monitor for changes across consecutive lines.
Examples
Basic usage with sorting
table T = with
[| as Id, as Category |]
[| 1, "A" |]
[| 2, "A" |]
[| 3, "B" |]
[| 4, "B" |]
[| 5, "A" |]
T.HasChanged = changed(T.Category) scan T.Id
show table "Category changes" with
T.Id
T.Category
T.HasChanged
This produces:
| Id | Category | HasChanged |
|---|---|---|
| 1 | A | True |
| 2 | A | False |
| 3 | B | True |
| 4 | B | False |
| 5 | A | True |
Detecting day changes in a date series
table Sales = with
[| as Date, as Amount |]
[| date(2023, 1, 1), 100 |]
[| date(2023, 1, 1), 150 |]
[| date(2023, 1, 2), 200 |]
[| date(2023, 1, 2), 250 |]
[| date(2023, 1, 3), 300 |]
Sales.NewDay = changed(Sales.Date) scan Sales.Date
show table "Daily sales breakdown" with
Sales.Date
Sales.Amount
Sales.NewDay
This produces the following table of daily sales:
| Date | Amount | NewDay |
|---|---|---|
| Jan 1, 2023 | 100 | True |
| Jan 1, 2023 | 150 | False |
| Jan 2, 2023 | 200 | True |
| Jan 2, 2023 | 250 | False |
| Jan 3, 2023 | 300 | True |
Detecting stock level changes by product
table StockLevels = with
[| as Date, as Product, as Stock |]
[| date(2023, 1, 1), "Widget A", 120 |]
[| date(2023, 1, 2), "Widget A", 85 |]
[| date(2023, 1, 3), "Widget A", 85 |]
[| date(2023, 1, 1), "Widget B", 50 |]
[| date(2023, 1, 2), "Widget B", 50 |]
[| date(2023, 1, 3), "Widget B", 75 |]
StockLevels.StockChanged = changed(StockLevels.Stock)
by StockLevels.Product
sort StockLevels.Date
show table "Stock Level Changes" with
StockLevels.Date
StockLevels.Product
StockLevels.Stock
StockLevels.StockChanged
This examples produces the following table of stock level changes:
| Date | Product | Stock | StockChanged |
|---|---|---|---|
| Jan 1, 2023 | Widget A | 120 | True |
| Jan 2, 2023 | Widget A | 85 | True |
| Jan 3, 2023 | Widget A | 85 | False |
| Jan 1, 2023 | Widget B | 50 | True |
| Jan 2, 2023 | Widget B | 50 | False |
| Jan 3, 2023 | Widget B | 75 | True |
Remarks
The changed process function requires a scan/sort option to specify the order in which values will be compared. Without a specified order, your code will not compile.
This process can be used with any data type that supports equality comparison, including numbers, text, dates, and booleans.
Recipes and best practices
- Segmenting data by changes: Use
changedto identify natural boundaries in sorted data:Dates.NewMonth = changed(month(Dates.Date)) scan Dates.Date - Counting transitions: Combine with
sumto count how many times a value changes:categoryChanges = sum(if changed(Items.Category) scan Items.Id then 1 else 0) - Track delivery status changes for notifications: Identify when a package’s delivery status changes (e.g., to trigger customer notifications):
DeliveryLog.StatusChanged = changed(DeliveryLog.Status) by DeliveryLog.TrackingNumber scan DeliveryLog.Timestamp