OLAP SSAS MDX Как получить значение показателя предыдущей выбранной / видимой даты - PullRequest
0 голосов
/ 18 сентября 2018

Как получить предыдущий элемент даты только среди выбранных / видимых членов измерения даты?

Я пробовал функции PREVMEMBER и LAG, но они возвращают предыдущую календарную дату (вчера).

Данные в кубе OLAP:

DATE       | SUM
-----------------
2018-09-01 | 500
2018-09-02 | 150
2018-09-03 | 300
2018-09-04 | 777
2018-09-05 | 900
2018-09-06 | 1200
2018-09-07 | 1500

В моем запросе я выбираю разные даты в фильтре и Мне нужно получить СУММУ предыдущей видимой даты :

DATE       |  SUM | PREV_SUM
-------------------------------
2018-09-02 |  150 | NULL
2018-09-04 |  777 | 150 (from 2018-09-02)
2018-09-07 | 1500 | 777 (from 2018-09-04)

Мой запрос MDX:

WITH
    MEMBER PREV_MEMBER AS
        MEMBERTOSTR([dim_date].[Day Id].CURRENTMEMBER.PREVMEMBER)
    MEMBER PREV_MEMBER_LAG AS
        MEMBERTOSTR([dim_date].[Day Id].CURRENTMEMBER.lag(1))
    MEMBER PREV_SUM AS
        SUM(
            STRTOMEMBER(PREV_MEMBER),
            [Measures].[SUM]
        )
SELECT
    NON EMPTY {
        [Measures].[SUM],
        PREV_SUM,
        PREV_MEMBER,
        PREV_MEMBER_LAG
    } ON COLUMNS,
    NON EMPTY {(
        [dim_date].[Day Id].ALLMEMBERS
    )} ON ROWS
FROM (
    SELECT ({
        [dim_date].[Day Id].&[20180902],
        [dim_date].[Day Id].&[20180904],
        [dim_date].[Day Id].&[20180907]
    }) ON COLUMNS
    FROM [cub_main]
)

Мой результат (возвращается вчера):

DATE     | SUM  |  PREV_SUM | PREV_MEMBER                     | PREV_MEMBER_LAG
--------------------------------------------------------------------------------------------
20180902 | 150  |       500 | [dim_date].[Day Id].&[20180901] | [dim_date].[Day Id].&[20180901]
20180904 | 777  |       300 | [dim_date].[Day Id].&[20180903] | [dim_date].[Day Id].&[20180903]
20180907 | 1500 |      1200 | [dim_date].[Day Id].&[20180906] | [dim_date].[Day Id].&[20180906]

Как я могу получить PREV_SUM только среди выбранных / отображаемых членов?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018
WITH
    // Create custom set
    SET SSS AS
        {
            [dim_date].[Day Id].&[20180902],
            [dim_date].[Day Id].&[20180904],
            [dim_date].[Day Id].&[20180907]
        }

    // Find current date member rank in custom set
    // Decrement index of current member by 2
    // Use ITEM function
    MEMBER PREV_MEMBER AS
        SETTOSTR(SSS.ITEM(RANK([dim_date].[Day Id].CURRENTMEMBER, SSS)-2))
    MEMBER PREV_SUM AS
        SUM(
            STRTOSET(PREV_MEMBER),
            [Measures].[SUM]
        )
SELECT
    NON EMPTY {
        [Measures].[SUM],
        PREV_MEMBER,
        PREV_SUM
    } ON COLUMNS,
    NON EMPTY {(
        // Use custom set in rows as a date filter
        SSS
    )} ON ROWS
FROM [cub_main]
0 голосов
/ 21 сентября 2018

Попробуйте создать пользовательский набор в предложении WITH. Набор будет составлен из дат.

Затем используйте функцию GENERATE для итерации по набору. Я думаю, что лаг должен использовать только даты в наборе.

(извиняюсь, я не в состоянии проверить компьютер)

...