В настоящее время я сталкиваюсь с трудностями при создании меры DAX (или скрипта Python, или чего-то еще) для расчета локального расстояния между самым последним действием и предыдущим, при этом все данные уже присутствуют в одной таблице. Несмотря на обширные исследования, все примеры, которые я нашел, включают две таблицы, что не применимо к моей ситуации.
Таблица содержит следующие столбцы: идентификатор карты, с помощью которой было выполнено действие, идентификатор действия, идентификатор местоположения, дата регистрации (обратите внимание, что действие может начаться, например, 10-го числа, но соответствующей датой является дата окончания). , поэтому в этом случае датой на самом деле будет 11-е число), дата/время начала и окончания, широта и долгота.
Цель состоит в том, чтобы пользователь мог фильтровать данные по идентификатору карты, а затем по дате регистрации. После фильтрации данные должны быть упорядочены по дате и времени, а мера, которую я собираюсь создать, должна вычислять расстояние от местоположения предыдущей записи.
Я понимаю, что это может показаться немного запутанным, поэтому позвольте мне пояснить некоторые примеры данных:
Предположим, что это данные, хранящиеся в базе данных. Теперь я покажу, что увидит пользователь при фильтрации на дашборде.
Это то, что увидит пользователь при применении фильтров; .distanceKM будет рассчитываться в порядке записей. Надеюсь, этого достаточно, чтобы вы поняли мой вопрос. Жду решения данного вопроса или даже предложения.
P.S.: Мне пришлось создать случайные данные для защиты конфиденциальной информации, но идея, думаю, ясна.
Попробуйте меру, похожую на:
.distanceKM =
var thisLat = MAX('YourTable'[LATITUDE])
var thisLng = MAX('YourTable'[LONGITUDE])
var prevRow = OFFSET(-1, DISTINCT(ALLSELECTED('YourTable')), ORDERBY([ENDTIME], ASC))
var prevLat = CALCULATE(MAX('YourTable'[LATITUDE]), prevRow)
var prevLng = CALCULATE(MAX('YourTable'[LONGITUDE]), prevRow)
// from 2nd answer at https://stackoverflow.com/a/21623206/21688343
var r = 6371 // Earth's radius in KM
var p = DIVIDE( PI(), 180 )
var a = 0.5 - DIVIDE(COS( (thisLat - prevLat) * p), 2) + COS(prevLat * p) * COS(thisLat * p) * DIVIDE(1 - COS((thisLng - prevLng) * p), 2)
var dist = 2 * r * ASIN(SQRT(a))
return IF(NOT ISBLANK(prevLat), dist, 0)
Основная часть — использование OFFSET
для получения предыдущей строки.
См. https://pbidax.wordpress.com/2022/12/23/introducing-dax-window-functions-part-2/ для получения хорошей рецензии на эту тему.