Range Filter on a Text Dimension

Range Filter on a Text Dimension

//

Tableau provides many types of filter including range filters for dates and numerical data, but what of textual dimensions? For instance lets say we have a dimension with data in the following format, 3-digit months with a 2-digit year and a period used by the client to adjust the year end balance:

Period Sales
Jan-10 129
Feb-10 185
Mar-10 89
Apr-10 124
Adj-10 23
May-10 156

This is a date based range of values, however the dates do not conform to any of the built-in date formats Tableau uses. The below visualisation demonstrates the result that we want:

 

So how do this work? The first requirement is Tableau version 6 as we are using parameters to select the start and end of the range.

Step 1) Download the data file and create a new workbook in Tableau connected to this data

Download from here Range Data

Step 2) Add two parameters to the sheet

Right-click the dimension you want to provide a range filter on (in this case Period) and select Create Parameter. Call these “StartPeriod” and “EndPeriod”

Step 3) Create a calculated field

This field is a string containing all of the values that the dimension will contain (this bit is the long-winded bit, and if your dimension data changes you need to update this field also.) In this example the string would read:

“Jan-10Feb-10Mar-10Apr-10Adj-10May-10Jun-10Jul-10Aug-10Sep-10Oct-10Nov-10Dec-10”

call the field “Range_Periods”.

Step 4) Add another calculated field

Call it “Range_Filtered_Period”. This generates the field we will use on the filter shelf. The syntax for this field is:

CONTAINS(MID([Range_Periods],FIND([Range_Periods],[StartPeriod]),ABS(FIND([Range_Periods],[EndPeriod])-FIND([Range_Periods],[StartPeriod]))+6),[Period])

This line of code searches the Range_Periods string (using the FIND function) for the [StartPeriod] selected, for instance “Feb-10” would return the number 6.
It then uses the FIND function again to find the [EndPeriod],  e.g. “Adj-10” would return 24, we then add 6 (the length of each data item in the dimension) to this to find the end of the selected [EndPeriod].

We can then use these two numbers to remove all of the periods we don’t want from the [Range_Periods] string, to do this we use MID by providing the [Range_Periods] string and the two number from the FIND functions.

This gives us the string “Feb-10Mar-10Apr-10Adj-10”

Lastly we use CONTAINS, this function takes a string to search through, in this case our new [Range_Periods] string, and a substring to search for, our [Period] dimension.

Step 5) Add this new calculated field to the filter shelf

Add [Range_Filtered_Period] to the filter shelf and select “True” when the filter dialog box pops up.

Step 6) Have a play with the StartPeriod and EndPeriod parameters

See how it filters the visualisation.

Bonus point

The only issue with our current code is that it does not take into account that a user may select a [StartPeriod] that is later than the [EndPeriod], so edit the calculated field and replace the code with the below:

CONTAINS(

 IF FIND([Range_Periods],[EndPeriod])>FIND([Range_Periods],[StartPeriod]) THEN
MID([Range_Periods],FIND([Range_Periods],[StartPeriod]),ABS(FIND([Range_Periods],[EndPeriod])-FIND([Range_Periods],[StartPeriod]))+6)
ELSE
MID([Range_Periods],FIND([Range_Periods],[EndPeriod]),ABS(FIND([Range_Periods],[EndPeriod])-FIND([Range_Periods],[StartPeriod]))+6)
END
,[Period])

This adds in logic to check for this situation.

Summary

This range filter works well on any data that is sequential, it could be date periods, letters in the alphabet or any string. You just have to ensure that the data is sequential and that there are no breaks or out of sequence data items. You also need to have a dimension field where the data items are all of the same length, in the above example 6 characters long.

Check back soon where I will be building in AND, OR, BETWEEN, NOT and other types of operators to this concept.

Need Expert Help?

See Our Full Menu of Data Services

InterWorks uses cookies to allow us to better understand how the site is used. By continuing to use this site, you consent to this policy. Review Policy OK

×

Interworks GmbH
Ratinger Straße 9
40213 Düsseldorf
Germany
Geschäftsführer: Mel Stephenson

Kontaktaufnahme: markus@interworks.eu
Telefon: +49 (0)211 5408 5301

Amtsgericht Düsseldorf HRB 79752
UstldNr: DE 313 353 072

×

Love our blog? You should see our emails. Sign up for our newsletter!