Как выполнить вычисление (в многомерных выражениях) в кубе SSAS, чтобы получить разницу между значением из текущей строки и значением из предыдущей строки?

#ssas #cube #dimension #calculation #measure

#ssas ( ссас ) #куб #измерение #вычисление #мера

Вопрос:

Я хотел бы произвести вычисление, чтобы получить разницу между departDate из моей текущей строки и arriveDateNextStop из моей предыдущей строки. У меня есть таблица фактов, которая содержит несколько столбцов. Тремя наиболее важными столбцами являются: id, departDate, arriveDateNextStop.

Если у меня есть, например, эти две строки в моей таблице фактов:

  • идентификатор departDate arriveDateNextStop
  • 1 01-01-2019 03-01-2019
  • 1 04-01-2019 07-01-2019

Объяснение: 1 января 2019 года я отправляюсь в следующий пункт назначения и прибываю туда 3 января 2019 года. 4 Января 2019 года я снова отправляюсь в следующий пункт назначения и прибываю туда 7 января 2019 года.

Теперь я хотел бы знать, сколько дней было простоя (количество дней между прибытием и следующим отправлением). Итак, в этом примере время простоя будет равно 1, потому что между 3 января 2019 года и 4 января 2019 года один день.

Сначала я выполнил это «вычисление» в Management Studio в виде SQL-запроса. Смотрите запрос ниже:

 SELECT s.Id, s.departDate as Depart_current_place, s.arriveDateNextStop as Arrival_next_stop, LAG(arriveDateNextStop) OVER (ORDER BY arriveDateNextStop) AS Arrival_current_stop, DATEDIFF(DAY, LAG(arriveDateNextStop) OVER (ORDER BY arriveDateNextStop), departDate) AS Amount_of_days
FROM MyTable s
WHERE Id = 9
GROUP BY s.departDate, s.Id, s.arriveDateNextStop 
ORDER BY s.departDate 
  

Этот запрос работает нормально, но как я могу выполнить это в моем кубе в виде вычисления в многомерных выражениях?

Комментарии:

1. Вы можете добавить свойство «Номер дня» (атрибут без иерархии) в ваше измерение даты, это будет номер дня от 1/1/1900 или любого другого года, который вы предпочитаете. И вычтите это свойство (адресуйте его следующим образом . CurrentMember. Свойства («Номер дня»)): текущий участник — currentmember.prevmember. Разделите этот показатель на несколько простых показателей: 1) номер дня отправления, 2) номер дня прибытия, 3) получите номер предыдущего дня прибытия, 4) вычитание в конечном вычисленном показателе. Обновите свой вопрос подробностями, которые вы выполнили, и мы решим проблемы, если они возникнут.

2. @AlexPeshik Но для каждой простой меры нужна другая мера, верно? Потому что, если я этого не сделаю, все будет равно null. У меня в моем кубе есть меры из моей factstable (и dimensions), но эти меры не имеют никакого смысла. Я понимаю, что вы говорите, и это звучит неплохо, но какую меру мне нужно использовать?

3. Я попытаюсь создать аналогичный пример и дам вам знать сегодня (я думаю, в течение нескольких часов).

4. Это было бы здорово!

Ответ №1:

У меня нет такого же примера, но аналогичная структура куба с датой завершения / получения:

 with
member departDate as [Received].[Year Qtr Month].CurrentMember.Member_Key
member arriveDate as [Completed].[Year Qtr Month].CurrentMember.Member_Key
member arriveDateNextStop as [Completed].[Year Qtr Month].CurrentMember.Lead(1).Member_Key
member idleDays as departDate-arriveDateNextStop
 SELECT NON EMPTY { departDate,arriveDate,arriveDateNextStop,idleDays } ON 0
 , NON EMPTY
 { ([Completed].[Year Qtr Month].[Date].ALLMEMBERS
  * [Received].[Year Qtr Month].[Date].ALLMEMBERS ) }  ON 1 
 FROM ( SELECT ( { [Completed].[Year Qtr Month].[Date].amp;[6213] } ) ON COLUMNS
 FROM [MyCube])
  

У меня также есть целочисленный ключ для измерения даты (CurrentMember.Member_Key). 1 = 1998-01-01, 2 = 1998-01-02 и т.д. До сегодняшнего дня. Вам нужно создать свойство в измерении даты, если ваш ключ даты является классическим YYYYMMDD (который вы не можете вычесть, чтобы получить разницу в днях, я могу сделать это в моем примере). И использовать его как CurrentMember.Свойства («имя свойства») вместо Member_Key.

Основная часть формулы: Функция задержки / опережения для получения предыдущего или следующего элемента.введите описание изображения здесь

Пожалуйста, обновите в случае возникновения вопросов.

Комментарии:

1. У вас есть: .amp;[6213]. Я думаю, что это стандартное значение, которое вы вводите (потому что arriveDate всегда равен 6213), но какое значение я должен туда ввести? И, к сожалению, я не могу добавить столбцы во временное измерение (они сказали мне не изменять структуру)

2. В качестве примера были взяты значения 6213, без фильтра все будет работать нормально, я просто хотел ограничить одним днем, чтобы показать динамический расчет разницы. Если вам не разрешено добавлять столбец, вы можете попытаться найти функцию VB (код многомерных выражений может содержать классические функции VB), и, вероятно, существует функция, подобная DATEDIFF.