Back in August, we released Calculated Fields, a feature that allows analysts to work more quickly by performing postSQL analysis. Now, we’re excited to bring you a new set of formulas within Calculated Fields: Analytic Functions. Analytic functions make Calculated Fields even more powerful by allowing you to calculate metrics based on specified partitions of your data.
What are analytic functions?
Analytic functions allow you to perform computations across a set of table rows that are somehow related to the current row. They are calculated based on what is currently in your visualization and do not consider any values that are filtered out of the visualization.
There are three types of analytic functions:
1. Analytic aggregation functions
RUNNING_AVG
,RUNNING_COUNT
,RUNNING_SUM

WINDOW_AVG
,WINDOW_COUNT
,WINDOW_SUM
2. Analytic navigation functions
FIRST
LAST

LOOKUP
3. Analytic number functions

INDEX
Window functions are a powerful analytic aggregation function. They perform calculations across a set of rows in your dataset that are related to the current row. However, window functions do not cause the rows to become grouped into a single output like aggregate functions do (e.g., SUM
). Instead, the returned output still contains the individual rows.
In SQL, you may specify the specific rows to use in a window function like so:
SELECT
SUM(columnA) OVER (ORDER BY columnB
ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS current_and_prev3
FROM my_table
Similarly, in Calculated Fields, you’d define windows by how many steps a datapoint is from your current index.
If a window is not specified or the range is set as the first and last indices, the system will calculate over the entire frame, like so:
How to use analytical functions
To get started, let’s walk through a few specific examples of analytic functions and how to use them.
Let’s say that you are tasked with building your company’s sales metrics. Instead of writing multiple custom SQL queries, you decide to leverage Mode’s new Calculated Fields to build these metrics on top of your raw dataset that will recalculate based on your visualization configurations.
You have the following fields in your sales dataset:
id
timestamp

amount
1. Cumulative sum of revenue
We’re interested in a cumulative sum of all the revenue we’ve generated in a given time frame. We can now calculate this in Calculated Fields, using the RUNNING_SUM
analytic function.
Create a calculated field using this formula:
RUNNING_SUM(SUM([amount]))
and drag our new field to the yaxis of our line chart.
For our xaxis, we can add a field of any time granularity or even change it later—our new calculated field will recalculate on the fly!
2. Rolling 7day revenue average
We’re also interested in understanding what our average daily revenue is. Because our revenue can fluctuate daybyday, we may look at our revenue averages through a rolling period.
For a 7day window, we can create a calculated field like so:
WINDOW_AVG(SUM([amount]), 6, 0)
and add it to our yaxis. This function calculates the average of the total amount between the previous 6 rows and the current row.
For our xaxis, this time we want to explicitly use day as the time granularity because we want a 7day window.
This formula calculates the total amount per day, SUM([amount])
, and then finds the average of that date (indexed 0) and the 6 days before that date.
3. Percent of total revenue
Analytic functions also allow us to calculated percentages based on the total.
Window functions, when there is no window specified, will calculate over the entire dataset. We can use this as the denominator in our percentage calculation:
SUM([amount])/WINDOW_SUM(SUM([amount]))
And just like before, we can use any time granularity on the xaxis and update them at any time because our calculated field will be recalculated every time.
4. Year over year change of weekly revenue
We’re getting fancy now. We can use the LOOKUP
analytic function to look up previous data points based on the current index. This allows us to reference data points that aren’t the current index and use that in calculations with the current index.
To calculate the percent change of this year’s weekly revenue from last year’s weekly revenue, we can use the LOOKUP
function to look back 52 weeks:
LOOKUP(SUM([amount]), 52)
Then, we can use our newly created calculated field to calculate the percent change compared to this week’s revenue:
SUM([amount])/[last_year_amount]  1
Because we’re looking back specifically 52 rows, we want to use **week** on the xaxis.
Try it yourself!
You can find the complete list of analytic functions we currently support, along with documentation of each function, in our functions library.
Pictured: You can view the list of functions we support and filter for specific function types, such as analytic functions, in our functions library.