Лучший способ вытащить строку, которая соответствует максимуму или минимуму - PullRequest
0 голосов
/ 08 июня 2018

Предположим, у меня есть TableA и TableB, которые не имеют отношения.

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

MinValue = MINX(TableA, [ComplexExpression])

Это прекрасно работает, но я действительно ищу ID для строки, где произошел этот минимум.


Ради конкретного примера давайте рассмотрим следующее:

TableA:

ID   X     Y
-------------
1   2.1  -1.3
2   3.5   0.5
3   6.5   5.9
4   3.1   4.2
5   2.8  -2.7
6   5.7  -1.5

TableB:

ID   X     Y
-------------
A   2.3   2.7
B   2.8  -4.8
C   4.1   1.1
D  -0.5   0.9
E  -3.7   2.4

Я добавил вычисленный столбец к TableA, который дает минимальное евклидово расстояние.

MinDist = MINX(TableB, ROUND(SQRT((TableA[X]-TableB[X])^2 + (TableA[Y]-TableB[Y])^2), 2))

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

ID   X     Y   MinDist  B-ID
-----------------------------
1   2.1  -1.3   3.12     C
2   3.5   0.5   0.85     C
3   6.5   5.9   5.28     A
4   3.1   4.2   1.70     A
5   2.8  -2.7   2.10     B
6   5.7  -1.5   3.05     C

Я получил ее для работы со следующим

MinDist = CALCULATE(MAX(TableB[ID]),
              FILTER(TableB,
                  ROUND(SQRT((TableA[X]-TableB[X])^2 + (TableA[Y]-TableB[Y])^2), 2)
                  = TableA[MinDist]))

, но в идеале я бы хотел более элегантный / эффективный метод, гдеМне не нужно использовать одно и то же сложное выражение дважды.

1 Ответ

0 голосов
/ 12 апреля 2019

В зависимости от того, как вы используете ваши данные, это может дать вам то, что вам нужно.

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

Итак, сначала я создал меру для расчета минимального расстояния.

MinDistToB = 
VAR SelectedX = SELECTEDVALUE(TableA[X])
VAR SelectedY = SELECTEDVALUE(TableA[Y])
RETURN
    MINX(TableB, ROUND(SQRT((SelectedX - [X]) ^ 2 + (SelectedY - [Y]) ^ 2), 2))

Затем я создал меру для получения идентификатора.

MinDistToB_ID = 
VAR MinDist = [MinDistToB]
RETURN
    MAXX(FILTER(TableB, [MinDistToB] = MinDist), [ID])

Бросив все этоматрица, я получаю это.

Using Measures

Если вам нужно, чтобы они были столбцами, вы можете определить расстояние следующим образом.

Col_MinDist = [MinDistToB]

И столбец идентификатора как этот.

Col_MinDistID = MAXX(FILTER(TableB, [MinDistToB] = [Col_MinDist]), [ID])

Положив их в таблицу, я получаю это.

Using Columns

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

...