Post-Image

Нестандартная сортировка

Рвав-рвав, собака Смайл опять с вами!

Есть просто отличная новость: любопытный пес изыскал возможность вложенной сортировки данных, несмотря на то, что сортировка возможна как бы по одному столбцу…

Пример:

Имеется набор данных следующего вида:

– оборудование и порядковый номер для его сортировки;

– устройства и порядковый номер для их сортировки.

art_009_screen_1

Задача:

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

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

Возможности сортировки “из коробки”:

  • Используя визуальный элемент “Matrix” (“Матрица”), не применяя при этом сортировку, мы можем получить следующий результат:

    art_009_screen_2

    При сборке матрицы, в качестве варианта “по умолчанию”, значения в столбце “Оборудование” будут отсортированы по возрастанию (по алфавиту) в качестве варианта “по умолчанию”.

  • Используя возможности визуального элемента (см. Дополнительные параметры -> Сортировка по убыванию), мы можем выстроить обратный порядок сортировки, то есть – по убыванию:

    art_009_screen_3

    Правильный порядок сортировки для 1-го уровня уровня матрицы – “Оборудование” все еще не устрановлен.

  • Используя дополнительные возможности сортировки по столбцу (см. Моделирование -> Сортировать по столбцу), мы можем выстроить правильный порядок сортировки по 1-му уровню матрицы – “Оборудование”:

    art_009_screen_4

    Несмотря на достигнутый результат, на этом возможности сортировки в стандартном функционале исчерпываются, и отсортировать 2-ой уровень матрицы – “Устройства” в правильном порядке не представляется возможным. При попотки применения сортировки по столбцу “Порядок внутри группы” для уровня “Устройства”, система выдаст ошибку следующего вида:

    art_009_screen_5

    Ошибка связана с тем, что в имена устройств, относящихся к разному оборудованию, дублируются.

    Обходные пути:

  • Желаемой цели можно добиться, присвоив к имени устройства порядковый номер, тогда название по оборудованию “Главная турбина” “изменится, например, на “1_Камера ГТ”, а базовые возможности сортировки по возрастанию обеспечат правильный внутренний порядок элементов.

  • Также можно обеспечить отсутствие дублей в названии устройства, привязав его, например, к оборудованию, то есть изменив на “Датчик ААА_ГТ”.

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

    Кастомная сортировка:

  • Для построения подобной сортировки нам понадобятся функии REPT и UNICHAR, при этом символ, который нам нужен, имеет код 8203. Использование конструкции, приведенной ниже, позволит добавить так называемые “ведущие нули” перед необходимым значением, при этом нули невидимы, то есть визуальных отличий для глаза нет. Формула рассчетного столбца:

    Сортировка =
    SWITCH (
        TRUE ();
        'Dataset'[Порядок внутри группы] = 1 && 'Dataset'[Оборудование] = "Главная турбина"; REPT ( UNICHAR ( 8203 ); 5 ) & "Камера ГТ";
        'Dataset'[Порядок внутри группы] = 2 && 'Dataset'[Оборудование] = "Главная турбина"; REPT ( UNICHAR ( 8203 ); 4 ) & "Датчик ААА";
        'Dataset'[Порядок внутри группы] = 3 && 'Dataset'[Оборудование] = "Главная турбина"; REPT ( UNICHAR ( 8203 ); 3 ) & "Датчик LLL";
        'Dataset'[Порядок внутри группы] = 4 && 'Dataset'[Оборудование] = "Главная турбина"; REPT ( UNICHAR ( 8203 ); 2 ) & "Датчик МММ";
        'Dataset'[Порядок внутри группы] = 5 && 'Dataset'[Оборудование] = "Главная турбина"; REPT ( UNICHAR ( 8203 ); 1 ) & "Датчик RRR";
        'Dataset'[Порядок внутри группы] = 1 && 'Dataset'[Оборудование] = "Вспомогательная турбина 1"; REPT ( UNICHAR ( 8203 ); 5 ) & "Датчик LLL";
        'Dataset'[Порядок внутри группы] = 2 && 'Dataset'[Оборудование] = "Вспомогательная турбина 1"; REPT ( UNICHAR ( 8203 ); 4 ) & "Датчик RRR";
        'Dataset'[Порядок внутри группы] = 3 && 'Dataset'[Оборудование] = "Вспомогательная турбина 1"; REPT ( UNICHAR ( 8203 ); 3 ) & "Датчик ААА";
        'Dataset'[Порядок внутри группы] = 4 && 'Dataset'[Оборудование] = "Вспомогательная турбина 1"; REPT ( UNICHAR ( 8203 ); 2 ) & "Датчик МММ";
        'Dataset'[Порядок внутри группы] = 5 && 'Dataset'[Оборудование] = "Вспомогательная турбина 1"; REPT ( UNICHAR ( 8203 ); 1 ) & "Камера ВТ1";
        'Dataset'[Порядок внутри группы] = 1 && 'Dataset'[Оборудование] = "Вспомогательная турбина 2"; REPT ( UNICHAR ( 8203 ); 5 ) & "Датчик ААА";
        'Dataset'[Порядок внутри группы] = 2 && 'Dataset'[Оборудование] = "Вспомогательная турбина 2"; REPT ( UNICHAR ( 8203 ); 4 ) & "Датчик МММ";
        'Dataset'[Порядок внутри группы] = 3 && 'Dataset'[Оборудование] = "Вспомогательная турбина 2"; REPT ( UNICHAR ( 8203 ); 3 ) & "Датчик LLL";
        'Dataset'[Порядок внутри группы] = 4 && 'Dataset'[Оборудование] = "Вспомогательная турбина 2"; REPT ( UNICHAR ( 8203 ); 2 ) & "Датчик RRR";
        'Dataset'[Порядок внутри группы] = 5 && 'Dataset'[Оборудование] = "Вспомогательная турбина 2"; REPT ( UNICHAR ( 8203 ); 1 ) & "Камера ВТ2";
        BLANK ()
    )

  • Для обеспечения правильного порядка элементов, столбец “Устройства” необходимо отсортировать по столбцу “Сортировка”. Если все сделано правильно, то вы добъетесь следующего результата:

    art_009_screen_6

    В последней таблице мы имеем правильную сортировку по обоим уровням – “Оборудование” и “Устройства”.

    Рвав-рвав, до новых встреч!

    Ваш Смайл