Как выполнить анализ пробелов и островов с помощью запроса мощности?

У меня есть набор данных, аналогичный приведенному ниже, и я пытаюсь провести в нем анализ пробелов и островов.

Элемент ТрансДейт ИнвенториКаунт объяснение Велосипед 01.01.2023 0 Когда элемент «Велосипед» впервые вставляется в базу данных, эту запись следует игнорировать при расчете. Велосипед 02.01.2023 15 Первое поступление велосипедов Велосипед 05.01.2023 10 Запас велосипедов частично исчерпан. Велосипед 07.01.2023 0 Запас велосипедов полностью исчерпан Велосипед 31.01.2023 15 Второе поступление велосипеда Машина 01.01.2023 0 Когда элемент «Автомобиль» впервые вставляется в базу данных, эту запись следует игнорировать при расчете. Машина 20.01.2023 3 Первое поступление автомобиля на склад Машина 21.01.2023 0 Первый запас автомобилей исчерпан Машина 25.01.2023 5 Второе поступление автомобиля на склад Машина 26.01.2023 0 Второй запас автомобилей исчерпан Машина 10.02.2023 2 Третье поступление автомобиля на склад Мотоцикл 01.01.2023 0 Когда элемент «Мотоцикл» впервые вводится в базу данных, эту запись следует игнорировать при расчете. Мотоцикл 02.01.2023 10 Первое поступление мотоциклов на склад Мотоцикл 05.01.2023 5 Парк мотоциклов частично исчерпан Мотоцикл 08.01.2023 0 Первый запас мотоциклов полностью исчерпан Мотоцикл 28.01.2023 15 Второе поступление мотоцикла

В запросе мощности я пытаюсь найти количество периодов отсутствия на складе и продолжительность (в днях) ситуации отсутствия на складе, что-то вроде:

Велосипеда 1 раз нет в наличии на 25 дней.

Машины 2 раза не было в наличии на 4 и 15 дней.

Мотоцикла 1 раз нет в наличии на 20 дней.

В Интернете не так уж много информации об анализе пробелов и островков в запросе мощности, и единственное, что я нашел, на самом деле не помогает. Мне удалось кое-что выяснить с помощью SQL, но у меня нет доступа к первоисточнику.

Любая помощь будет принята с благодарностью!

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
0
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

можем ли мы использовать 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 )
    )

Ну, можем? Ответы – не место для вопросов.

Solar Mike 08.07.2024 09:29

Спасибо, Райан, очень ценю. Я тоже посмотрю на это решение!

Test Test 09.07.2024 02:55
Ответ принят как подходящий

Вы можете использовать аналогичный подход в Power Query.

  1. Сортировать по TransDate
  2. ГруппаПо Item
  3. Затем во вложенной сгруппированной таблице:
    1. Удалите верхние строки, которые InventoryCount = 0.
    2. Добавьте новый столбец для NextDate, если InventoryCount > 0.
    3. Заполните NextDate
    4. Удалить дубликаты InventoryCount и NextDate — это удалит последовательные 0.
    5. Вычислите дни, вычитая TransDate из NextDate.
    6. Фильтр по Days больше 0
    7. Расширить таблицу необходимыми столбцами
let
    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"

Чтобы получить результирующую таблицу, похожую на:

Большое спасибо, Сэм, это работает очень хорошо. У меня есть только одна проблема: иногда перед первой записью с положительным значением имеется несколько записей с нулевым значением инвентаризации. Есть ли у вас идеи, как я могу обойти проблему?

Test Test 09.07.2024 02:53

Конечно, обновленный ответ выше. Table.Skip(_, 1) обновлено до Table.Skip(_, each [InventoryCount] = 0)

Sam Nseir 09.07.2024 04:40

Еще раз огромное спасибо Сэму. Это работает как шарм, и я чрезвычайно благодарен за вашу драгоценную помощь. Мне пора учиться, чтобы глубже понять, что ты только что сделал!!!

Test Test 09.07.2024 05:39

Привет, Сэм, предложенное решение хорошо работает в большинстве условий. Я провел несколько тестов на разных наборах данных, и, по-видимому, если есть последовательные значения 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

Test Test 10.07.2024 08:35

Обновленный ответ выше. См. новый шаг 3.4, чтобы удалить последовательные 0.

Sam Nseir 10.07.2024 12:17

Работает как шарм. большое спасибо, Сэм!

Test Test 11.07.2024 03:59

Другие вопросы по теме