Различия в дате - PullRequest
       35

Различия в дате

1 голос
/ 18 октября 2019

Мне нужно создать таблицу измерений из текущего «набора данных» для использования в Excel и Power Bi. На данный момент информация была сохранена в книге Excel.

Я упростил книгу, чтобы установить ее в качестве примера. Вот ссылка для скачивания: https://1drv.ms/x/s!AkyEWh5MlySFoWOFMTC3GDXY09eS

В настоящее время все структурировано как сводная таблица, где заголовки столбцов представляют собой даты, например:

+----+----------+----------+----------+
| ID | 12/29/14 | 01/05/15 | 01/12/15 |
+----+----------+----------+----------+
| 00 | Darell   | Darell   | Darell   |
| 01 | Jarrod   | Annelle  | Todd     |
| 04 | Lakeesha | Linn     | Linn     |
+----+----------+----------+----------+

У меня нет- Поверните таблицу и сгруппируйте поля идентификатора и имени, а также вычислите минимальное и максимальное значения даты. Работает как шарм.

Проблема связана с последней датой, поскольку это даст мне максимальное значение для локальной группировки, и в действительности последний день будет за день до следующего столбца в исходных данных, напримерИтак:

Вот пример:

+----+----------+----------+----------+
| ID |   Name   |   From   |    To    |
+----+----------+----------+----------+
| 00 | Darell   | 12/29/14 | 01/05/15 |
| 00 | Kamala   | 01/12/15 | ...      |
| 01 | Jarrod   | 12/29/14 | 12/29/14 |
| 01 | Annelle  | 01/05/15 | 01/05/15 |
| 01 | Todd     | 01/12/15 | ....     |
| 04 | Lakeesha | 12/29/14 | 12/29/14 |
| 04 | Linn     | 01/05/15 | ....     |
| .. | ........ | ....     | ....     |
+----+----------+----------+----------+

Это упрощенный код, который я создал для этого:

let
Source = Excel.CurrentWorkbook(){[Name="RawData"]}[Content],

#"Unpivot [Table]" = Table.UnpivotOtherColumns(Source, {"ID"}, "Date", "Name"),

#"Group [Table]" = Table.Group(#"Unpivot [Table]", {"ID", "Name"}, {{"From", each List.Min([Date]), type date}, {"On", each List.Max([Date]), type date}}, GroupKind.Local)

in
#"Group [Table]"

Вот что яожидая получить в результате каждое имя, сгруппированное локально с начальной и конечной датами.

+----+----------+----------+----------+
| ID |   Name   |   From   |    To    |
+----+----------+----------+----------+
| 00 | Darell   | 12/29/14 | 01/11/15 |
| 00 | Kamala   | 01/12/15 | ....     |
| 01 | Jarrod   | 12/29/14 | 01/04/15 |
| 01 | Annelle  | 01/05/15 | 01/11/15 |
| 01 | Todd     | 01/12/15 | ....     |
| 04 | Lakeesha | 12/29/14 | 01/04/15 |
| 04 | Linn     | 01/05/15 | ....     |
| .. | ........ | ....     | ....     |
+----+----------+----------+----------+

с этим я сгенерирую каждую дату между «От» и «До» с

Table.AddColumn(#"Calculate [To]", "Date", each { Number.From([From])..Number.From([To]) })

1 Ответ

0 голосов
/ 29 октября 2019

Начните с того места, где вы находитесь в своей рабочей таблице,

  1. Добавьте Индексный столбец Начните с 0 с 1 на приращение;
  2. Дублируйте запрос и измените шаг Index Column , чтобы начать с 1 с 1 на приращение;
  3. Слияние второйзапрос с первым запросом. В окне Merge, удерживая нажатой клавишу Ctrl на клавиатуре и последовательно выбирая столбцы ID и Index в обоих запросах, как показано ниже (обратите внимание, что на моем скриншоте RowData (3) - дублированный запросв то время как RowData (2) является исходным запросом):

Merge

Разверните объединенный столбец, чтобы показать From дату и Использовать исходное имя столбца в качестве префикса ; Добавить Пользовательский столбец с помощьюследующая формула: =if [#"RawData.From"]=null then [On] else Date.AddDays([#"RawData.From"],-1) Удалите ненужных столбцов по желанию и сортируйте таблицу (необязательный шаг).

Затем можно добавить другой пользовательский столбец внайти дни между From и To за ID за Name.


РЕДАКТИРОВАТЬ # 2

Вы можете добавить два Индекс столбцы к исходному запросу вместо создания дублированного запроса. Обязательно отсортируйте запрос по ID по From, а затем добавьте столбцы Index , один из которых начинается с 0, а другой - с 1, затем объедините запрос с самим собой, выбравправильные столбцы, как показано ниже, и остальные шаги одинаковы.

Demo 2.0

Вот коды M заСцена для справки.

let
    Source = Excel.CurrentWorkbook(){[Name="RawData"]}[Content],
    #"Filter [null]" = Table.SelectRows(Source, each [ID] <> null and [ID] <> ""),
    #"Remove [Duplicates]" = Table.Distinct(#"Filter [null]", {"ID"}),
    #"Unpivot [Table]" = Table.UnpivotOtherColumns(#"Remove [Duplicates]", {"ID"}, "Date", "TM"),
    #"Detect Data Type" = Table.TransformColumnTypes(#"Unpivot [Table]",{{"ID", Int64.Type}, {"Date", type date}, {"TM", type text}}),
    #"Group [Table]" = Table.Group(#"Detect Data Type", {"ID", "TM"}, {{"From", each List.Min([Date]), type date}, {"On", each List.Max([Date]), type date}}, GroupKind.Local),
    #"Sorted Rows" = Table.Sort(#"Group [Table]",{{"ID", Order.Ascending}, {"From", Order.Ascending}}),
    #"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1),
    #"Added Index1" = Table.AddIndexColumn(#"Added Index", "Index.1", 1, 1),
    #"Merged Queries" = Table.NestedJoin(#"Added Index1", {"ID", "Index.1"}, #"Added Index1", {"ID", "Index"}, "Added Index1", JoinKind.LeftOuter),
    #"Expanded Added Index1" = Table.ExpandTableColumn(#"Merged Queries", "Added Index1", {"From"}, {"Added Index1.From"}),
    #"Added Custom" = Table.AddColumn(#"Expanded Added Index1", "To", each if [Added Index1.From]=null then [On] else Date.AddDays([Added Index1.From],-1)),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"On","Index", "Index.1", "Added Index1.From"})
in
    #"Removed Columns"

Дайте мне знать, если у вас есть какие-либо вопросы. Ура :) 1083 *

...