Power BI is turning 10! Tune in for a special live episode on July 24 with behind-the-scenes stories, product evolution highlights, and a sneak peek at what’s in store for the future.
Save the dateEnhance your career with this limited time 50% discount on Fabric and Power BI exams. Ends August 31st. Request your voucher.
Hi All please let me know if you we can create a start date and end date from a single column Date
Existing Data:
Phase | Date |
Phase1 | 15/10/2024 |
Phase1 | 16/10/2024 |
Phase1 | 17/10/2024 |
Phase 2 | 16/10/2024 |
Phase 2 | 17/10/2024 |
Phase1 | 31/10/2024 |
Phase1 | 1/11/2024 |
Phase1 | 2/11/2024 |
Phase 2 | 22/10/2024 |
Phase 2 | 23/10/2024 |
Create a new Dax calculation for start date and end date
start date - Is the start of continuous date from Date column
end date - is the end of continuous date from Date column
Example:
Phase | Start Date | End Date |
Phase 1 | 15/10/2024 | 17/10/2024 |
Phase 1 | 31/10/2024 | 2/11/2024 |
Phase 2 | 16/10/2024 | 17/10/2024 |
Phase 2 | 22/10/2024 | 23/10/2024 |
Solved! Go to Solution.
I think implementing this solution in power bi would be a much easier, please find the PBIX file attached.
Need a Power BI Consultation? Hire me on Upwork
Connect on LinkedIn
|
Hi,
Here is one way to do this. Due to the table not containing ids this took a bit of trial and error:
I hope this post helps to solve your issue and if it does consider accepting it as a solution and giving the post a thumbs up!
My LinkedIn: https://www.linkedin.com/in/n%C3%A4ttiahov-00001/
Proud to be a Super User!
Hi,
If your expected result is to have a new table, please check the below picture and the attached pbix file.
expected result table =
VAR _t = ADDCOLUMNS(
Data,
"@prevdate", MAXX(
OFFSET(
-1,
Data,
ORDERBY(
Data[Date],
ASC
),
,
PARTITIONBY(Data[Phase]),
MATCHBY(
Data[Phase],
Data[Date]
)
),
Data[Date]
)
)
VAR _condition = ADDCOLUMNS(
_t,
"@condition", IF(
INT(Data[Date] - [@prevdate]) = 1,
0,
1
)
)
VAR _group = ADDCOLUMNS(
_condition,
"@group", SUMX(
WINDOW(
1,
ABS,
0,
REL,
_condition,
ORDERBY(
Data[Date],
ASC
),
,
PARTITIONBY(Data[Phase]),
MATCHBY(
Data[Phase],
Data[Date]
)
),
[@condition]
)
)
VAR _result = ADDCOLUMNS(
SUMMARIZE(
_group,
Data[Phase],
Data[Date],
[@group]
),
"StartDate", MINX(
FILTER(
_group,
Data[Phase] = EARLIER(Data[Phase]) && [@group] = EARLIER([@group])
),
Data[Date]
),
"EndDate", MAXX(
FILTER(
_group,
Data[Phase] = EARLIER(Data[Phase]) && [@group] = EARLIER([@group])
),
Data[Date]
)
)
RETURN
SUMMARIZE(
_result,
Data[Phase],
[StartDate],
[EndDate]
)
Whether in DAX or PQ, either is easy.
let
Source = DATA,
#"Sorted Rows" = Table.Sort(Source,{{"Date", Order.Ascending}}),
#"Grouped per Phase" = Table.Group(#"Sorted Rows", "Phase", {"grp per Phase", each Table.Group(Table.AddIndexColumn(_, "Index"), {"Date","Index"}, {"grp per Date", each _}, 0, (x,y) => Byte.From(Duration.TotalDays(y[Date]-x[Date])<>y[Index]-x[Index]))}),
#"Expanded grp per Phase" = Table.ExpandTableColumn(#"Grouped per Phase", "grp per Phase", {"grp per Date"}),
#"Transformed Columns" = Table.TransformColumns(#"Expanded grp per Phase", {"grp per Date", each [Start = [Date]{0}, End = List.Last([Date])]}),
#"Expanded grp per Date" = Table.ExpandRecordColumn(#"Transformed Columns", "grp per Date", {"Start", "End"})
in
#"Expanded grp per Date"
Expertise = List.Accumulate( {Days as from Today}, {Skills and Knowledge}, (Current, Everyday) => Current & Day.LearnAndPractise(Everyday) ) |
Whether in DAX or PQ, either is easy.
let
Source = DATA,
#"Sorted Rows" = Table.Sort(Source,{{"Date", Order.Ascending}}),
#"Grouped per Phase" = Table.Group(#"Sorted Rows", "Phase", {"grp per Phase", each Table.Group(Table.AddIndexColumn(_, "Index"), {"Date","Index"}, {"grp per Date", each _}, 0, (x,y) => Byte.From(Duration.TotalDays(y[Date]-x[Date])<>y[Index]-x[Index]))}),
#"Expanded grp per Phase" = Table.ExpandTableColumn(#"Grouped per Phase", "grp per Phase", {"grp per Date"}),
#"Transformed Columns" = Table.TransformColumns(#"Expanded grp per Phase", {"grp per Date", each [Start = [Date]{0}, End = List.Last([Date])]}),
#"Expanded grp per Date" = Table.ExpandRecordColumn(#"Transformed Columns", "grp per Date", {"Start", "End"})
in
#"Expanded grp per Date"
Expertise = List.Accumulate( {Days as from Today}, {Skills and Knowledge}, (Current, Everyday) => Current & Day.LearnAndPractise(Everyday) ) |
Hi @eng_123 ,
You've already been provided with several solutions, and here’s another one. Since the DAX engine doesn't inherently preserve the original data order, I used Power Query (M) to lock in the data’s original sequence.
let
// Reference the user's existing query/table (Replace "YourTableName" with the actual table/query name)
Source = YourTableName,
// Change the types of columns
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Phase", type text}, {"Date", type date}}),
#"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Phase] <> "Phase")),
// Add a Group Number based on Phase changes using List.Accumulate
GroupedWithPhaseChange = List.Accumulate(
Table.ToRecords(#"Filtered Rows"),
{ [GroupNumber = 1, PreviousPhase = null, Rows = {}] },
(state, current) =>
let
currentGroup = if state{0}[PreviousPhase] <> null and current[Phase] <> state{0}[PreviousPhase]
then state{0}[GroupNumber] + 1
else state{0}[GroupNumber],
newRow = Record.AddField(current, "PhaseGroupIndex", currentGroup),
updatedState = {
[GroupNumber = currentGroup, PreviousPhase = current[Phase], Rows = List.Combine({state{0}[Rows], {newRow}})]
}
in
updatedState
){0}[Rows],
// Convert the list of records back to a table, respecting the original order
#"Grouped Table" = Table.FromRecords(GroupedWithPhaseChange)
in
#"Grouped Table"
The formula above will preserve the order in the original data, as shown below:
You can then summarize the OriginalTable by using the following DAX table formula:
Table = SUMMARIZE('OriginalTable',OriginalTable[Phase],OriginalTable[Start Date],OriginalTable[End Date])
This will generate the output shown below:
I have attached an example pbix file.
Best regards,
Hi,
If your expected result is to have a new table, please check the below picture and the attached pbix file.
expected result table =
VAR _t = ADDCOLUMNS(
Data,
"@prevdate", MAXX(
OFFSET(
-1,
Data,
ORDERBY(
Data[Date],
ASC
),
,
PARTITIONBY(Data[Phase]),
MATCHBY(
Data[Phase],
Data[Date]
)
),
Data[Date]
)
)
VAR _condition = ADDCOLUMNS(
_t,
"@condition", IF(
INT(Data[Date] - [@prevdate]) = 1,
0,
1
)
)
VAR _group = ADDCOLUMNS(
_condition,
"@group", SUMX(
WINDOW(
1,
ABS,
0,
REL,
_condition,
ORDERBY(
Data[Date],
ASC
),
,
PARTITIONBY(Data[Phase]),
MATCHBY(
Data[Phase],
Data[Date]
)
),
[@condition]
)
)
VAR _result = ADDCOLUMNS(
SUMMARIZE(
_group,
Data[Phase],
Data[Date],
[@group]
),
"StartDate", MINX(
FILTER(
_group,
Data[Phase] = EARLIER(Data[Phase]) && [@group] = EARLIER([@group])
),
Data[Date]
),
"EndDate", MAXX(
FILTER(
_group,
Data[Phase] = EARLIER(Data[Phase]) && [@group] = EARLIER([@group])
),
Data[Date]
)
)
RETURN
SUMMARIZE(
_result,
Data[Phase],
[StartDate],
[EndDate]
)
Hi,
Here is one way to do this. Due to the table not containing ids this took a bit of trial and error:
I hope this post helps to solve your issue and if it does consider accepting it as a solution and giving the post a thumbs up!
My LinkedIn: https://www.linkedin.com/in/n%C3%A4ttiahov-00001/
Proud to be a Super User!
I think implementing this solution in power bi would be a much easier, please find the PBIX file attached.
Need a Power BI Consultation? Hire me on Upwork
Connect on LinkedIn
|
User | Count |
---|---|
25 | |
12 | |
8 | |
6 | |
6 |
User | Count |
---|---|
26 | |
12 | |
12 | |
10 | |
6 |