0% found this document useful (0 votes)
92 views

Daxquest

The document discusses various date and time functions used in DAX including: 1. DATE, DATEDIFF, DATEVALUE, EDATE, and EOMONTH which are used to manipulate and extract components from dates. 2. TIME functions like TIMEVALUE, HOUR, MINUTE, and SECOND which convert between date/time formats and extract time components. 3. Time intelligence functions like TOTALQTD, MTD, YTD, DATESBETWEEN, and SAMEPERIODLASTYEAR which perform calculations over time periods.

Uploaded by

Shreya
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
92 views

Daxquest

The document discusses various date and time functions used in DAX including: 1. DATE, DATEDIFF, DATEVALUE, EDATE, and EOMONTH which are used to manipulate and extract components from dates. 2. TIME functions like TIMEVALUE, HOUR, MINUTE, and SECOND which convert between date/time formats and extract time components. 3. Time intelligence functions like TOTALQTD, MTD, YTD, DATESBETWEEN, and SAMEPERIODLASTYEAR which perform calculations over time periods.

Uploaded by

Shreya
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 8

Q. What are the types of DAX functions you have used ?

 Text Functions :- Concatenate , ConcatenateX, Exact , Find , Mid, Trim ,Replace, Substitute , Search , Lower, Upper.
 Stastical Functions :- Avg , AvgX , Count , CountX, MAX, MAXA, Min, RANKX
 Time Intelligence Fun :- Total QTD, MTD, YTD, End Of Month , End Of Quarter , Last Date , Next Day/Month/Year
 Date & Time Functions :- Date , DateDiff, Day, Edate, EoMonth, Hour, Minute , Weekday , Calendar
 Filter Functions :- ALL, ALLEXCEPT, CALCULATE, LookupValue
 Math & Trig Functions :- ABS , Even , Int , Round , Sum , SUMX
 Logical Functions :- And , Coalesce , If , If error , Not , OR , Switch , True
 TableManipulation Functions :- ADDCOLUMN, CROSSJOIN , Distinct , EXCEPT , Group BY , Union , Summarize.

Q: What are the DATE and TIME FUNCTIONS you have used ?
1. DATE  It takes three arguments and returns the specified date in datetime format.
Syntax :- DATE(<year>, <month>, <day>)
Example :-

2. DATEDIFF  It returns the difference between two dates in number format.

Syntax :- DATEDIFF(<start_date>, <end_date>, <interval>) .


Here interval could be in year , month , day , quarter , year
Example :- emp_exp (Joining_date, Today(),year)  returns no of year like 2.
3. DATEVALUE  It converts a date in the form of text (like Friday,August 24,2018) into datetime format.
Syntax :- DATEVALUE(date_text)
Example :- DATEVALUE(Friday,August 24,2018) will return 8/24/2018 12:00:00
TIMEVALUE(time_text) Converts a text string that represents a certain time of the day into date time format.

4. EDATE  Returns the date that is the indicated number of months before or after the start date.
Syntax :- EDATE(<start_date>, <months>)
Example :- MATURITY_DATE = EDATE(Today(), 15)
Used to calculate maturity dates or due dates that fall on the same day of the month as the date of issue.
5. EOMONTH  Returns the last day of the month in date time format.
Syntax :- EOMONTH(<start_date>, <months>)
here in month we can give 0-same month, 1- Next Month , -1  Prev month
Example :- EndOfMonth = EOMONTH(EMP(JOIN_DATE),1)
6. DAY  It returns the Day from the date . return will be like 1,2 ….31
7. Month  It returns the Month from the Date. In number format like (10,11,12 etc)
8. Year  It returns the Year from the Date like 2020,2017 etc.
9. YEARFRAC  It returns fraction of the year between two dates.
Syntax :- YEARFRAC(<start_date>, <end_date>, <basis>)
Example :- YEARFRAC("Jan 1 2007","Mar 1 2007") Here basis is optional. It
will return zero.(2007-2007).In basis use 2 to divide actual by 360.
10. Quarter  It returns the quarter based on date. like 1, 2 ,3 4.
11. Hour/Minute/second  It will return the hour/minute/second from the date given.
12. UTCTODAY()  UTCTODAY returns the time value 12:00:00 PM for all dates. Today() also returns same.
13. UTCNOW()  UTCNOW function is similar but returns the exact time and date.
14. NOW ()  it returns the current date and time that value updated each time you open the worksheet. The result of
the NOW function changes only when the column that contains the formula is refreshed. It is not updated
continuously. The TODAY function returns the same date but is not precise with regard to time; the time returned is
always 12:00:00 AM and only the date is updated.
15. WeekDay Returns a number from 1 to 7 identifying the day of the week of a date. By default the day ranges from
1 (Sunday) to 7 (Saturday).
Return type: 1, for week begins on Sunday (1) and ends on Saturday (7) Return type: 2, for Monday to
Sunday Return type: 3, week begins on Monday (0) and ends on Sunday (6).
16. WeekNum  It Returns the week number for the given date and year according to the return_type value
The week number indicates where the week falls numerically within a year.
Syntax :- WEEKNUM(<date>, <return_type>)
A number that determines the Return value: use 1 when the week begins on Sunday; use 2 when
the week begins on Monday. The default is 1.
17. TIME  Converts hours, minutes, and seconds given as numbers to a time in datetime format.
18. CALENDAR  Returns a table with a single column named "Date" that contains dates from the specified start date
to end date, inclusive of those two dates. An error is occurred if start_date is greater than end_date.
Syntax :- CALENDAR(<start_date>, <end_date>).
19. CALENDARAUTO()  Returns a table with a single column named "Date" that contains a contiguous set of dates.
The range of dates is calculated automatically based on data in the model.
Syntax : CALENDARAUTO([fiscal_year_end_month])
The date range returned is dates between the beginning of the fiscal year associated with MinDate and the end of
the fiscal year associated with MaxDate. In this example, the MinDate and MaxDate in the data model are July 1,
2010 and June 30, 2011.
CALENDARAUTO() will return all dates between January 1, 2010 and December 31, 2011.
CALENDARAUTO(3) will return all dates between March 1, 2010 and February 28, 2012

Q: What are the TIME INTELLIGENCE functions you have used ?

20. DATEADD()  It will Returns either a table that contains a column of dates or a column in existing table, shifted
either forward or backward in time by the specified number of intervals from the dates in the current context.
Syntax :- DATEADD(<dates>,<number_of_intervals>,<interval>)
Here no_of_intervals will be 1,2,3 for forward or -1,2- for backward and interval can be year , month ,
quarter, day.
Example :- Column = DATEADD(Sheet1[Master Date],5,MONTH).

21. PARALLELPERIOD() :- The PARALLELPERIOD function is similar to the DATEADD function except that
PARALLELPERIOD always returns full periods at the given granularity level instead of the partial periods that
DATEADD returns. For example, if you have a selection of dates that starts at June 10 and finishes at June 21 of the
same year, and you want to shift that selection forward by one month then the PARALLELPERIOD function will
return all dates from the next month (July 1 to July 31); however, if DATEADD is used instead, then the result will
include only dates from July 10 to July 21.
22. DATESBETWEEN()  It will returns a table or work as a filter to calculate functions that contains a column
of dates that begins with a specified start date and continues until a specified end date.
Syntax :- DATESBETWEEN (<dates>, <start_date>, <end_date>)
Example :- Sales between 1 may 2017 to 15 may 2017
SALES_1-15_May = Calculate([total_sales], datesbetween(Data[salesdate],’’01/05/2017”,”15/05/2017’))
Last_7_days_sale = Calculate([total_sales], datesbetween(Data[salesdate],today()-7,today()))

23. DATESINPERIOD()  It will returns table or work as a filter to calculate functions that contains a column of
dates that begins with a specified start date and continues for the specified number and type of date
intervals.
Syntax :- DATESINPERIOD(<dates>, <start_date>, <number_of_intervals>, <interval>)
Example :- Calculate([total_sales],datesinperiod (data[salesdate],lastdate(data[salesdate]),-7,day))
It will return the total sales from the last seven date.

24. SAMEPERIODLASTYEAR()  Returns a table that contains a column of dates shifted one year back in time from
the dates in the specified dates column. It is just equivalent to DATEADD(dates, -1, year)
Syntax :- SAMEPERIODLASTYEAR(<dates>)
Ex :- CALCULATE(SUM(Reseller[SalesAmount_USD]),SAMEPERIODLASTYEAR(DateTime[DateKey]))

Q What are some Pre_requisities to being able to do Time-Intelligence function ?


Ans:- It needs a Date Table with continuous date range and there should not be any date missed. And Need to
define the relationship between Date table and other FACT Table.
Q Why Date table is required to time-intelligence functions ? Any alternative ?
Ans :- Time intelligence functions enable you to manipulate data using time periods such as years, quarters,
months, and days and creating calculations over those time periods. To use time functions in Power BI, you need
to have a table that contains at least one column that has a data type of Date. This column should have only one
row per day for all the range of dates with no gaps. Mark the table as Date table.
Q3. ISERROR vs IFERROR?
Iferror can be used with if statements.

Q4. What is Related vs Related table and when to use it ?

Ans :- Both the functions work for fetching the data from other table.

Related Related Table


RELATED function, which requires a column name as Returns a table with all the rows related to the
an input and returns a related value from another current table.
table. 
It Requires relation between two tables 1-1 and M-1. 1-1, 1-M or M-1 relationships required here.
Related(table[column]) SumX (RelatedTable(Table [column[)
Here in Total cost , with SumX , we are using Salestable but we need here cost column which is in different table. So by
using related function we can use this cost column here.
Total Cost = SUMX (salestable; salestable[quantity]*RELATED(product_data[Cost])

Scenario: - In the context, let us consider a one-to-many relationship. If you have CUSTOMER master and FACT tables then
trying to create a relationship, then that would create a one-to-many relationship.
It means we have unique records on the customer table but multiple same values on the FACT table with reference to the
connected columns.
If you want to create a new calculated column on the CUSTOMER table then you need to use RELATEDTABLE DAX function.
On the other hand, when you want to create a calculated column on the FACT table then you need to use the RELATED
function.
Q. RELATED vs LOOKUPVALUE – which one to use?
Ans :- Both can be used to assign values from other.
RELATED:-
It is simple - only use one parameter.
It can work through multiple tables, if they are connected by the M-1 relation. 
LOOKUPVALUE :- Retrieves a value based from a table based on FK from another table.
Tables don´t need any relation - so it can be used when the relation can´t be created.
LOOKUPVALUE can use multiple keys at the same time. So, for example, you can use not only a surname, but first name
and surname together.
LOOKUPVALUE doesn´t need the other table - it can take values from the table where LOOKUPVALUE formula takes place.
Typically, it takes values from other rows, using some key.
DEPTNAME = LookUPValue (Dept[deptName] , Dept(deptno) , emp(Dept)) Here DeptName is retrieval column and others
two are matching column.

Q.What is special or Unique about Calculate or CalculateTable Functions ?


Ans :- Add to exiting filter context of queries.
Override filter context from queries.
Remove Existing filter context from queries.
Limitations :- Filter parameters can only operate on a single column at a time. Flter parameters cannot refrence a metric.

Q. What is Calculated Column in Power Bi and why would you use them?

Ans:- Calculated Columns are DAX expressions that are computed during the models refresh process for each row of the
given column and can be used like any other column in the model.
Calculated columns are not compressed and thus consume more memory and result in reduced query performance.

Q. What is Calculated & Calculated table in DAX and diffrence between them ?

Ans :- The basic diffrence is calculate will return number and calculated table will return a Table.
Since a Measure return only one value (scalar value) , so calculate table cant be directly used for measure purpose
whereas Calculate can be used. If calculate table needs to be used in measure then it can be with conjuction of SUMX
which needs one table and expressions.
Q34. How would you create trailing X month metrics via DAX against a non-standard calendar?
Ans :- Use Calculate function to control filter context of measures.
ALL to remove exiting filter in Date dimension
Filter to identify which rows of the date dimension to use.

Q35. What are some benefit of using Variable in DAX ?

Ans :-  Complex calculation requirements often involve writing compound or complex expressions. Compound expressions
can involve the use of many nested functions, and possibly the reuse of expression logic.
Using variables in your DAX formulas helps you write complex and efficient calculations.
Variables can: Improve performance Improve readability Simplify debugging Reduce complexity
EX :- Sales YoY Growth % =
VAR SalesPriorYear =
CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)

Q. What is Group by & Summazrize in DAX ?

Ans :- Summarize and GroupBy will help us to summarize the data based on the set of columns. For exaple we have a EMP
table and we need to summarize the data based on the department wise, we can apply the summarize.
Both are same but in Groupby we need to use currentgroup function to calculate any expression whereas in summarize we
don’t required any such things.
EX :- SAL_BY_DEPT = GroupBy (EmpTable , Emp(DEPT), “TOTALSAL”, SUMX(CurrentGroup(), EMp(SAL)));

Q.What is UNION in DAX ?


Ans :- FinalData = Unon(EMP1, EMP2) ----- It will club the data between two tables.

Q. What is CrossJoin in DAX ?


Ans :- CrossJoinResult = Crossjoin(Table1 , Table2) – It will give the cartesian product of two tables.

Q. What is Summarize , Summarizecolumns and SummarizeTable diffrence ? *****


Ans :- It returns a summary table for the requested totals over a set of groups.  SUMMARIZE and SUMMARIZECOLUMNS is
that SUMMARIZE keeps both a row context and a filter context active in the expression where you specify the aggregation
whereas SUMMARIZECOLUMNS provides a filter context only and no row context.
summerizeColumns have better performance and Summerizecolumns will apply filter context later after cross join and we
can't use same column twice in summerizecolumns.
Typically, it is recommended to use SummarizeColumns to add columns rather than Summarize.
The difference is that Summarize function has several pitfalls and performance issues, and for compatibility issues it cannot
be fully fixed by Microsoft.
if you want to summarize [Product] and [Sales]*[Unit Price] as [Profit] column, maybe you will use this:
Summarize Table = SUMMARIZE('Table','Table'[Product],"Profit",SUMX('Table','Table'[Sales]*'Table'[Unit Price]))
But this is not correct though it shows well.
You should use this instead of the above:
Summarize Table-2 =
ADDCOLUMNS(SUMMARIZE('Table','Table'[Product]),"Profit",CALCULATE(SUMX('Table','Table'[Sales]*'Table'[Unit Price])))
If you use Power BI, Analysis Services 2016, or Excel 2016(*), you can use a new DAX function called
SummarizeColumns which apparently is just a replacement of Summarize:
SummarizeColumns Table = SUMMARIZECOLUMNS('Table'[Product],"Profit",SUMX('Table','Table'[Sales]*'Table'[Unit
Price]))
When you compare the query plans of the two versions using DAX Studio, you will notice that the SummarizeColumns is
extremely efficient, requiring just one storage engine query and a smaller number of steps in the physical query plan.

Q.What is ADD Column function in DAX ?


Ans :- It helps us to ADD new column in existing table. Suppose we have two table EMP & DEPT and we want to add one
column from Dept to Emp So by giving some FK , We can add new column in same table.

Q . Diffrence between parallel Period and Same period last year ?

Ans :- Both are same.


Q:- Diff between SUM and SUMX ?

Ans :- Sum is Aggregate function whereas SumX is Iterator function. Sum Calculates whole column in a table and SUMX
calculates sum row by row. Sum takes a column and it calculates vertically while SUMX takes a column and it calculates
horizontally, row by row.

Note :-whenever we have to do group-by something ,we can’t use measure so we have to use call col

Q6:- COUNT, COUNTA, COUNTX, COUNTAX ,DISTINCTCOUNT , COUNTROWS,COUNTBLANK ??

Ans :- Count will count only number and date and no blank values, COUNTA will count anything text, date, number and no
blank values.

In CountX = Here we can count Product subcategory CAPS in list_price column or no of seller whose sales>100 soemthing
like that.

COUNTX(FILTER(Product,RELATED(ProductSubcategory[EnglishProductSubcategoryName])="Caps"), Product[ListPrice])

COUNTX function counts only values, dates. If the function finds no rows to count, it returns a blank where as COUNTAX do
for all.(strings as well).

DistinctCount – It counts distinct rows in columns with blank values as well.

Countrows – This function is used to count no of rows in a table. Only can be used with table
COUNTROWS(RELATEDTABLE(Reseller Sales)). It can also be used with filter and count something like country = ‘EMEA’
or sales > 500.

CountBLANK :- Counts the number of blank cells in a column.

Q7. What is Filter function in DAX ?

Ans :- Returns a table that represents a subset of another table or expression.


Syntax (<table>,<filter>) Note :- with the && we can add another filter.

Q8 . How to Calculate Running total or cumulative sales ?


Ans:- Here Cumulative sales give the sales of current year and Cummulative sales LY gives the Last year total
running.

Where total sales and total sales LY is calculated as below.

Q9. How to Rank Categories by SALES ?

Ans :- RANK = RANKX (Table , Expression , [value] , ,order,ties)


Rank = RANKX (ALL(TABLE), [total_sales] , , desc)

Q10. How to Get top 10 clients in power BI as profit wise?

Ans :-

Note :- Here Values() function will return distinct unique values in a column.
Q.10.1 How to get sales between some range ?

Ans :- The same can be used with the help of AND Function.

Q11. How to Get weekdays and weekends from Dates ?

ANS :- With the help of Format Function We can get the weekday , week name or month name . Actually it Converts a
value to text according to the specified format.
Syntax :- FORMAT(<value>, <format_string>)
Example :- 1. Week num = Format(Sales[date],1) here 1 is for Sunday or 2 for Monday.
2. Weekday = Format(Sales[date],”DDDD”) it shows the Full day name.
Similarly in <format_string> we can use “MMMM” for month name or currency etc.

Q12. How to Get Total Sales on weekdays and weekends ?

Ans :-

Here Or function is used in weekends because they want it to calculate on either on Sunday or in Monday.

Q: What is the benefit of using Variables in DAX ?

Ans :-  Complex calculation requirements often involve writing compound or complex expressions. Compound
expressions can involve the use of many nested functions, and possibly the reuse of expression logic.
By Declaring a variable , we can reuse the value many times inside a DAX query. By So query will look more cleaner, easy to
read and understand its functions.
Using variables in your DAX formulas helps you write complex and efficient calculations.
Variables can: Improve performance Improve readability Simplify debugging Reduce complexity
EX :- Sales YoY Growth % =
VAR SalesPriorYear =
CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)

Q13. How to create your own Dynamic KPI ?

Ans :- Step 1 :- Calculate total sales as below

Step 2 :- Add a column Chart Give in axis – year and Values –


Total_sales.

Step 3 :- Format – Data Colours – Conditional Formating – then


choose format by Field value from drop down and choose the field KPI which you
have created above.

Q14. How to Get Total Year to Sales Date ? TOTALYTD/TOTALMTD/ TotalQTD

Ans :- It will give the total year to year wise sales. Just for Jan to Dec 2017 it will give running total and again in 2018 jan to
dec it will give running total.
Q15. Diffrence between DISTINCT() and Values() in DAX ?

Ans :- Both Returns distinct records but values returns Blank where as Distinct does not return blank.
The DISTINCT function allows a column name or any valid table expression to be its argument but the VALUES function
only accepts a column name or a table name as the argument.

Q.What is difference between MAX() and MAXA() functions ?

Ans :- Max Only Work with Numerical value else return NULL or Zero whereas MAXA It takes Numerical , Text Or logical
values.
If the calculation is for numeric values then use MAX , if it is for non Numeric values then use MAXA.

Q. How to get Index like month starting from 202001 to 202012?

Ans :- Use GenerateSeries in Dax. Or we can do it with months function.

https://community.powerbi.com/t5/Desktop/Index-and-year-month/td-p/569336

Q. ALL, ALLSELECTED, ALLEXCEPT ?

Ans :- This DAX functions can be worked as Filter context. If we use ALL that means it will remove all the filter that is
applied on this table or column. There wont be any effect even we apply any filter after calculations as well.

ALL_SELECTED :- Removes context filters from columns and rows in the current query , while retaining all other
context filtersor explicit filters. That means it will give value only which is being selected only in outer filters. Suppose in
current filter we will select Year -2018 and product XYZ i.e it will give us only 2018 XYZ value.

ALL_EXCEPT :- REMOVES all context filters on a table except filters that have been applied to the specified columns.
That means ALL EXCEPTS are going to return all the rows from tables except for those rows that are not affected by those
specified columns. It would clear all the filter except one particular column that is being applied. For example we have two
things in slicer product and country and we have given it like ALLEXCEPT ( table , Product column) ) . So it will ignore
whatever filter we will apply in country column. But if we will select anything in prodcut , the filter will apply accordingly.

Q. Can we add date diff column with new column in Direct Query ?

Ans :- it is not possible to use DATEDIFF function in calculated columns in DirectQuery mode. However, you can create a
measure instead.

Q. What is DAX and which types of DAX supported in power BI ?

Ans :- Dax helps you create new information from data already in your model with a series of Functions , operators and
constants. It will help you to get most out of your data.

There are two types of DAX Tabular and Multi-Dimensional

Q. Dax for Hirearchical RLS ?


Ans :- 1st create path with the PATH function
Emp_path = PATH(Emp[Emp_Id],Emp[Manager])
Then in RLS give this condition as filter.
Pathcontains(emp[emp_path],Maxx(Filter( Emp , [Email]=USERPRINCIPALNAME()), EMP[Emp_id]))
Q:- Concatenate Function in Power BI DAX ?
Ans :- Concatenate function is used to Concatenate two columns.

Q. Filter in DAX ?
Ans :- It helps to filter out the data based on specific condition. So we can use it with CALCULATE functions.
Ex:- total_Sales = Calculate ( SUM[sales], FILTER(Country, Region_name = “AUS”))
Note :- By Adding logical Operator || We can add more Filter condition.

Q.What is Variable function ?


Ans :- If we are receiving somewhere NULL function or Zero Values and we want to show this in Visualization then we will
be using using variable functions.
Q: IfERROR in DAX ?
Ans :- It helps us to handle error in DAX. It gonna evaluates the expression and if it returns error , it will handle.
Q:- Substitute in DAX ?
Ans :- Substitite Measure = Substitute(“TERESA”, “SA”, “AB”)
O/P :- TEREAB ( It is case sensitive functions )

Q. Search & FIND in DAX ?


Ans :- Search and Find both are same but search is case insenstive and Find is case sensitive finctions.
SEARCH = search(“n”, ‘Printer) – If it could not find, it will give error then need to handle this.
Find = find(‘A’ , ‘Abhishek’, , Blank());
Q. Exact in DAX ?
Ans :- It will help us to compare two test strings and returns either true or false.
ExactColumn = EXACT (Text1, Text2)
Q. Replace in DAX ?
Ans :- It will take 4 arguments and replace it.
NewColumn = REPLACE(EMP[jobcode] , 1, 2,”T”) here 1 is starting position , 2 is end position and T is to be replaced.

Q. Trim functions in DAX ?


Ans :- It removes the space from Left , right or middle as well. Trim = Trim (“ “)

Q. If Condition in DAX ?
Ans :- IF (Condition , True part , False Part ) here False is optional.
Ex :- Gender = IF(emp[Gender] = “M” , “MALE” , “FEMALE”)

Q. Switch In DAX ?
Ans :- MonthName = Switch(EMP[Month] , 1, ‘JAN’ ,
2, ‘FEB’)
Q. MID in PowerBI ?
Ans :- It acts like a SubStr in SQL. This is one of the string functions that helps us to get part of string.
JobCode = MID(EMP[JobCode] , 1,3)

Q.Left in DAX ?
Ans:- JC_CHAR = Left(EMP(jobcode),3) __| -- Will Return 1 st three character from the column.

Q.Lower & UPPER In DAX ?


Ans :- Converts all character into Lower Alphabets and Similarly UPPER will convert all char in Upper letters.

Q. REPT in DAX ?
Ans :- It is a DAX function which help us to repeat the given text or string no of times.
REPT_OP = REPt(EMP(JOBCODE), 1) if 1 it will be same as table column , pass 2 , will be copied twice and so on.

Q. EARLIER in DAX ?
Ans :- It is useful for Nested calculations where we want a certain value as input and produce calculations based on inputs.

You might also like