У меня есть набор данных, аналогичный приведенному ниже, и я пытаюсь провести в нем анализ пробелов и островов.
В запросе мощности я пытаюсь найти количество периодов отсутствия на складе и продолжительность (в днях) ситуации отсутствия на складе, что-то вроде:
Велосипеда 1 раз нет в наличии на 25 дней.
Машины 2 раза не было в наличии на 4 и 15 дней.
Мотоцикла 1 раз нет в наличии на 20 дней.
В Интернете не так уж много информации об анализе пробелов и островков в запросе мощности, и единственное, что я нашел, на самом деле не помогает. Мне удалось кое-что выяснить с помощью SQL, но у меня нет доступа к первоисточнику.
Любая помощь будет принята с благодарностью!
можем ли мы использовать DAX для получения этого результата?
Column =
VAR _last =
MAXX (
FILTER (
'Table',
'Table'[Item] = EARLIER ( 'Table'[Item] )
&& 'Table'[TransDate] < EARLIER ( 'Table'[TransDate] )
),
'Table'[TransDate]
)
VAR _lastinventory =
MAXX (
FILTER (
'Table',
'Table'[Item] = EARLIER ( 'Table'[Item] )
&& 'Table'[TransDate] = _last
),
'Table'[InventoryCount]
)
VAR _lastex =
MAXX (
FILTER (
'Table',
'Table'[Item] = EARLIER ( 'Table'[Item] )
&& 'Table'[TransDate] = _last
),
'Table'[explanation]
)
RETURN
IF (
_lastinventory = 0
&& CONTAINSSTRING ( _lastex, "depleted" ),
DATEDIFF ( _last, 'Table'[TransDate], DAY )
)
Спасибо, Райан, очень ценю. Я тоже посмотрю на это решение!
Вы можете использовать аналогичный подход в Power Query.
TransDate
Item
InventoryCount
= 0.NextDate
, если InventoryCount
> 0.NextDate
InventoryCount
и NextDate
— это удалит последовательные 0.TransDate
из NextDate
.Days
больше 0let
Source = YourTable,
#"Sorted Rows" = Table.Sort(Source,{{"TransDate", Order.Ascending}}),
#"Grouped Rows" = Table.Group(#"Sorted Rows", {"Item"}, {{"Rows", each _, type table [Item=nullable text, TransDate=nullable date, InventoryCount=nullable number]}}),
#"RemoveTop0Rows" = Table.TransformColumns(#"Grouped Rows", { "Rows", each Table.Skip(_, each [InventoryCount] = 0) }),
#"Add NextDate" = Table.TransformColumns(#"RemoveTop0Rows", { "Rows", each Table.AddColumn(_, "NextDate", each if [InventoryCount] > 0 then [TransDate] else null) }),
#"FillUp NextDate" = Table.TransformColumns(#"Add NextDate", { "Rows", each Table.FillUp(_ ,{"NextDate"}) }),
#"Remove Consecutive zeros" = Table.TransformColumns(#"FillUp NextDate", { "Rows", each Table.Distinct(_, {"NextDate", "InventoryCount"}) }),
#"Add days" = Table.TransformColumns(#"Remove Consecutive zeros", { "Rows", each Table.AddColumn(_, "Days", each Duration.Days([NextDate] - [TransDate]), Int64.Type) }),
#"Filter Days" = Table.TransformColumns(#"Add days", { "Rows", each Table.SelectRows(_, each [Days] > 0) }),
#"Expanded Rows" = Table.ExpandTableColumn(#"Filter Days", "Rows", {"Days"}, {"Days"})
in
#"Expanded Rows"
Чтобы получить результирующую таблицу, похожую на:
Большое спасибо, Сэм, это работает очень хорошо. У меня есть только одна проблема: иногда перед первой записью с положительным значением имеется несколько записей с нулевым значением инвентаризации. Есть ли у вас идеи, как я могу обойти проблему?
Конечно, обновленный ответ выше. Table.Skip(_, 1)
обновлено до Table.Skip(_, each [InventoryCount] = 0)
Еще раз огромное спасибо Сэму. Это работает как шарм, и я чрезвычайно благодарен за вашу драгоценную помощь. Мне пора учиться, чтобы глубже понять, что ты только что сделал!!!
Привет, Сэм, предложенное решение хорошо работает в большинстве условий. Я провел несколько тестов на разных наборах данных, и, по-видимому, если есть последовательные значения 0 (как в случае ниже), расчет не работает. Если нет нескольких нулевых вхождений, ваше решение работает отлично. Элемент TransDate InventoryCount Автомобиль 01.01.2023 0 Автомобиль 18.01.2023 3 Автомобиль 19.01.2023 0 Автомобиль 20.01.2023 0 Автомобиль 21.01.2023 0 Автомобиль 25.01.2023 5 Автомобиль 26.01.2023 0 Автомобиль 10.02.2023 2
Обновленный ответ выше. См. новый шаг 3.4, чтобы удалить последовательные 0.
Работает как шарм. большое спасибо, Сэм!
Ну, можем? Ответы – не место для вопросов.