Я работал над решением для вычисления чего-то похожего на FirstSortedValue Qlikview в DAX для Power BI.

Насколько мне известно, нет готового решения для получения функциональности по получению текстового значения (во многом как категории), которое по своему рангу находится на n-й позиции.

Мой вопрос: почему это работает с одним столбцом, но возвращает ошибку нескольких столбцов при использовании в таблице?

CALCULATE (
    SAMPLE (
        1,
        FILTER (
            'table_name',
            RANKX (
                ALL ( 'table_name'[column_name] ),
                CALCULATE ( COUNT ( 'table_name'[column_name] ) ),
                , , SKIP
            )
                = Nth
        ),
        TRUE ()
    )
)

Также другой вариант:

CALCULATE (
    SAMPLE ( 1, VALUES ( 'table_name'[column_name] ), TRUE () ),
    FILTER (
        'table_name',
        RANKX (
            ALL ( 'table_name'[column_name] ),
            CALCULATE ( COUNT ( 'table_name'[column_name] ) ),
            , , DENSE
        )
            = Nth
    )
)

Обе эти и многие другие мои попытки работают, когда это один столбец, но почему это не сработает при использовании в таблице с несколькими столбцами? Он должен вернуть образец 1 текстового значения в соответствии с выбранным мной рангом N? Сродни ответу на вопрос «Какое название продукта занимает N-е место по продажам по количеству продаж?».

Я в тупике, но все еще пытаюсь найти ответ. Firstnonblank - это не вариант, потому что меня не интересует решение, позволяющее получить только 1-й ответ; не предлагайте этого.

dax
0
Vaidøtas Ivøška 22 Окт 2018 в 10:28

2 ответа

Лучший ответ

Я придумал решение, которое работает с таблицами с несколькими столбцами с оговоркой - связи, поскольку в формуле используется SAMPLE (1 ...), предпочтение отдается алфавиту:

SAMPLE(1, FILTER(ALL('X'[Name]), RANKX(ALL(X[Name]), CALCULATE(COUNT('X'[Name])),,,skip) = Nth), TRUE())

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

РЕДАКТИРОВАТЬ: 23 октября 2018 г. Вот! Последняя лаконичная версия: отлично работает!

Мера =

VAR Nth = [number] RETURN CONCATENATEX(DISTINCT('table_name'[column_name]), CALCULATE(FILTER(VALUES('table_name'[column_name]), RANKX(ALL('table_name'[column_name]), CALCULATE(COUNT('table_name'[column_name])),,,Dense) = Nth)),",")
0
Vaidøtas Ivøška 23 Окт 2018 в 15:56

Самый простой способ заставить это работать из того, что у вас есть, - превратить вашу таблицу в один столбец, используя SELECTCOLUMNS.

Следующее даст вам таблицу с одним столбцом с именем столбца «Имя столбца».

SELECTCOLUMNS( FILTER( [...] ), "Column Name", 'table_name'[column_name] )

CALCULATE (
    SAMPLE (
        1,
        SELECTCOLUMNS(
            FILTER (
                'table_name',
                RANKX (
                    ALL ( 'table_name'[column_name] ),
                    CALCULATE ( COUNT ( 'table_name'[column_name] ) ),
                    , , SKIP
                )
                = Nth
            ),
            "Column Name",
            'table_name'[column_name]
        ),
        TRUE ()
    )
)

Тем не менее, может быть лучший способ решить вопрос в целом, поэтому, пожалуйста, предоставьте минимальный полный проверяемый пример образцов данных и желаемых вывод если возможно.

1
Alexis Olson 22 Окт 2018 в 19:26
52924268