PowerQuery PowerBI 根据 StartDate 和 EndDate 之间的条件合并 2 个表
PowerQuery PowerBI merge 2 tables based on condition between StartDate and EndDate
我尝试使用 Power Query/PowerBI: Absence 和 dimDate 加入 2 tables 来创建下面的结果 table:
缺席 table
+------------+--------------+--------------+-----------+-----------+
| EmployeeId | EmployeeName | AbsenceType | StartDate | EndDate |
+------------+--------------+--------------+-----------+-----------+
| 1 | A | Annual Leave | 2/01/2017 | 5/01/2017 |
| 2 | B | Sick Leave | 4/01/2017 | 6/01/2017 |
+------------+--------------+--------------+-----------+-----------+
dimDate table
+------------+
| FullDate |
+------------+
| 1/01/2017 |
| 2/01/2017 |
| 3/01/2017 |
| 4/01/2017 |
| 5/01/2017 |
| 6/01/2017 |
| 7/01/2017 |
| 8/01/2017 |
| 9/01/2017 |
| 10/01/2017 |
+------------+
结果
+------------+--------------+--------------+-----------+
| EmployeeId | EmployeeName | AbsenceType | Date |
+------------+--------------+--------------+-----------+
| 1 | A | Annual Leave | 2/01/2017 |
| 1 | A | Annual Leave | 3/01/2017 |
| 1 | A | Annual Leave | 4/01/2017 |
| 1 | A | Annual Leave | 5/01/2017 |
| 2 | B | Sick Leave | 4/01/2017 |
| 2 | B | Sick Leave | 5/01/2017 |
| 2 | B | Sick Leave | 6/01/2017 |
+------------+--------------+--------------+-----------+
我通常使用 SQL 来创建这个结果,但是我不知道如何在 PowerQuery 中高效地完成它。
SELECT A.EmployeeId
,A.EmployeeName
,A.AbsenceType
,D.FullDate
FROM Absence AS A
INNER JOIN dimDate AS D ON (
D.FullDate >= A.StartDate
AND D.FullDate <= A.EndDate
)
注意:我试过Full Join between 2 tables Absence and dimDate,如果dimDate.FullDate >= StartDate 和dimDate.FullDate <= 结束日期。然而,这种方法似乎对大型 table 无效,并且它会在过滤之前创建冗余记录,因此速度非常慢。
请多多指教
不需要合并。您可以创建一个列,其中包含 StartDate 和 EndDate 之间所有日期的嵌入列表。然后展开该列。
let
Source = Table1,
#"Added Custom" = Table.AddColumn(Source, "Date", each List.Dates([StartDate],1+Duration.Days([EndDate]-[StartDate]),#duration(1,0,0,0))),
#"Expanded Date" = Table.ExpandListColumn(#"Added Custom", "Date"),
#"Changed Type" = Table.TransformColumnTypes(#"Expanded Date",{{"Date", type date}}),
#"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"StartDate", "EndDate"})
in
#"Removed Columns"
我尝试使用 Power Query/PowerBI: Absence 和 dimDate 加入 2 tables 来创建下面的结果 table:
缺席 table
+------------+--------------+--------------+-----------+-----------+
| EmployeeId | EmployeeName | AbsenceType | StartDate | EndDate |
+------------+--------------+--------------+-----------+-----------+
| 1 | A | Annual Leave | 2/01/2017 | 5/01/2017 |
| 2 | B | Sick Leave | 4/01/2017 | 6/01/2017 |
+------------+--------------+--------------+-----------+-----------+
dimDate table
+------------+
| FullDate |
+------------+
| 1/01/2017 |
| 2/01/2017 |
| 3/01/2017 |
| 4/01/2017 |
| 5/01/2017 |
| 6/01/2017 |
| 7/01/2017 |
| 8/01/2017 |
| 9/01/2017 |
| 10/01/2017 |
+------------+
结果
+------------+--------------+--------------+-----------+
| EmployeeId | EmployeeName | AbsenceType | Date |
+------------+--------------+--------------+-----------+
| 1 | A | Annual Leave | 2/01/2017 |
| 1 | A | Annual Leave | 3/01/2017 |
| 1 | A | Annual Leave | 4/01/2017 |
| 1 | A | Annual Leave | 5/01/2017 |
| 2 | B | Sick Leave | 4/01/2017 |
| 2 | B | Sick Leave | 5/01/2017 |
| 2 | B | Sick Leave | 6/01/2017 |
+------------+--------------+--------------+-----------+
我通常使用 SQL 来创建这个结果,但是我不知道如何在 PowerQuery 中高效地完成它。
SELECT A.EmployeeId
,A.EmployeeName
,A.AbsenceType
,D.FullDate
FROM Absence AS A
INNER JOIN dimDate AS D ON (
D.FullDate >= A.StartDate
AND D.FullDate <= A.EndDate
)
注意:我试过Full Join between 2 tables Absence and dimDate,如果dimDate.FullDate >= StartDate 和dimDate.FullDate <= 结束日期。然而,这种方法似乎对大型 table 无效,并且它会在过滤之前创建冗余记录,因此速度非常慢。
请多多指教
不需要合并。您可以创建一个列,其中包含 StartDate 和 EndDate 之间所有日期的嵌入列表。然后展开该列。
let
Source = Table1,
#"Added Custom" = Table.AddColumn(Source, "Date", each List.Dates([StartDate],1+Duration.Days([EndDate]-[StartDate]),#duration(1,0,0,0))),
#"Expanded Date" = Table.ExpandListColumn(#"Added Custom", "Date"),
#"Changed Type" = Table.TransformColumnTypes(#"Expanded Date",{{"Date", type date}}),
#"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"StartDate", "EndDate"})
in
#"Removed Columns"