0

真的可以在这个 mdx 查询上使用某人的手。我试图在每个用户和每天的基础上生成过去 365 天的滚动中位数。我需要中位数是每个用户响应天数的中位数。这似乎是一个简单的计算,但我看不出如何让它与混合中的交叉连接一起工作。任何帮助将非常感激!如果你甚至有一个关于攻击这个方向的建议,那就太好了。

SET [2Years] AS
'{[FirstOrderDate].[Full Date].&[2010-01-15T00:00:00]:[FirstOrderDate].[Full Date].[2012-08-20T00:00:00]}'

MEMBER [Measures].[2YearMedianLag]
AS
median({[FirstOrderDate].[Full Date].currentmember.lag(365):[FirstOrderDate].[FullDate].currentmember} , [Measures].[Response Days])

SELECT {[Measures].[Response Days], [Measures].[MedianLag]} ON 0,
NonEmpty(crossjoin( [days],
[User].[User ID].children),[Measures].[Response Days]) ON 1
FROM [UserRevenue]

预先感谢您的协助。 

编辑:

SampleData (UserName varchar(100) null, FirstOrderDate Datetime null, ResponseDays int null)
('Jim', '2001-01-03', 10)
('Fred', '2001-01-03', 80)
('Frank', '2001-01-04', 30)
('Sally', '2001-01-05', 18)
('Joan', '2001-01-06', 26)
('Bill', '2001-01-06', 15)
('Ted', '2001-01-08', 29)
('Sam', '2001-01-10', 9)
('Jane', '2001-01-17', 200)

SampleOutput (FirstOrderDate datetime null, MedianResponseDays int null)
('2001-01-03', 45)
('2001-01-04', 30)
('2001-01-05', 24)
('2001-01-06', 22)
('2001-01-07', 22)
('2001-01-08', 26)
('2001-01-09', 26)
('2001-01-10', 22)
('2001-01-11', 22)
('2001-01-12', 22)
('2001-01-13', 22)
('2001-01-14', 22)
('2001-01-15', 22)
('2001-01-16', 22)
('2001-01-17', 26)
4

3 回答 3

1

这很棘手,因为您需要每天在行上使用一组不同的滚动日期。您确定要 365 延迟吗?这给了你 1 年加 1 天的时间。无论如何,此技术使用内联命名集为用户/日期的每个组合创建一个命名集并为其分配一个唯一编号,然后您可以在 StrToSet 函数中再次将该命名集拉回以匹配当前行的用户和日期。此版本考虑到每个单独的用户:

with 
set Users as [User].[User ID].Children
set UsersDates as NonEmpty((Users, [FirstOrderDate].[Full Date].children), [Measures].[Response Days])

set [Rolling Period] as 

    Generate(
       UsersDates,
          StrToSet(
        "{[FirstOrderDate].[Full Date].currentmember.lag(364): [FirstOrderDate].[Full Date].currentmember} as RP" + CStr(UsersDates.CurrentOrdinal)
          )
    )

member [Measures].[Median Lag] as 
median(
    StrToSet("RP" + 
    CStr(Rank(([User].[User ID].CurrentMember, [FirstOrderDate].[Full Date].CurrentMember), UsersDates)))
  , [Measures].[Response Days])

select
{
[measures].[Response Days]
, [measures].[Median Lag]
}

on columns,
UsersDates
on rows
from UserRevenue

更新 #1:此版本忽略单个用户,而是使用所有用户对适用日期集的响应:

 with 
    set Users as [User].[User ID].Children
    set Dates as NonEmpty([FirstOrderDate].[Full Date].children, [Measures].[Response Days])

    set [Rolling Period] as 

        Generate(
           Dates,
              StrToSet(
            "{[FirstOrderDate].[Full Date].currentmember.lag(364): [FirstOrderDate].[Full Date].currentmember} as RP" 
+ CStr(Dates.CurrentOrdinal)
              )
        )

    member [Measures].[Median Lag] as 
    median(
        StrToSet("RP" + 
        CStr(Rank([FirstOrderDate].[Full Date].CurrentMember, Dates)))
      , ([Measures].[Response Days], [User].[User ID].[All]))

    select
    {
    [measures].[Response Days]
    , [measures].[Median Lag]
    }

    on columns,
    (Users, Dates)
    on rows
    from UserRevenue

更新#2:第三次是魅力?这是一个查询,可以让我在您的示例输出中得到结果。关键是该集合需要为当前日期的每个日期/用户组合生成一个元组,并将其存储为内联命名集合,每个可能的日期一个,由排名唯一标识。因此,当您查看行上的日期列表时,第一个日期 (1/3) 是排名 1,第二个日期 (1/4) 是排名 2,依此类推。第一个日期 2001 年 1 月 3 日有两个项目 - 一个与 Jim 为 1/3,另一个与 Fred 为 1/3。所以在计算中位数时,需要使用相关集合中每个项目的响应天数。因为 1/3 在列表日期中排名第 1,所以检索称为 RP1 的集合,结合集合中项目(Jim 和 Fred)的响应天数并计算中位数。然后下一个日期,1/4,

with 
    set Users as [User].[User ID].Children
    set Dates as [FirstOrderDate].[Full Date].children

    set [Rolling Period] as 
        Generate(
           Dates,
              StrToSet(
            "NonEmpty(({[FirstOrderDate].[Full Date].currentmember.lag(364): [FirstOrderDate].[Full Date].currentmember} 
            , Users), [Measures].[Response Days]) as RP" 
+ CStr(Dates.CurrentOrdinal)
              )
        )

    member [Measures].[Median Lag] as 

    median(
        StrToSet("RP" + 
        CStr(Rank([FirstOrderDate].[Full Date].CurrentMember, Dates)))
      , [Measures].[Response Days])


    select
    {[measures].[Median Lag]}

    on columns,

    Dates
    on rows
    from UserRevenue
于 2012-08-26T07:25:59.763 回答
0

MedianResponseDays 度量对用户进行迭代以计算Response Days从给定日期到当前日期的中值。我把365天。在行上。

WITH MEMBER [Measures].[MedianResponseDays] AS
    Median([User].[User ID].children * [FirstOrderDate].[FullDate].CurrentMember:[FirstOrderDate].[FullDate].DefaultMember, [Measures].[Response Days])
SELECT {[Measures].[MedianResponseDays]} ON 0,
NON EMPTY {[FirstOrderDate].[Full Date].currentmember.lag(364):[FirstOrderDate].[FullDate].currentmember} ON 1
FROM [UserRevenue]
于 2012-08-27T17:25:28.790 回答
0

我有一个事实表 fct_line_details 有两列 mtid,生产力

  mtid     productivity
  ----     ------------
  1        400
  1        200
  1        600
  2        700
  3        900

我想计算 SSAS 中每个 mtid 的中位数。(mtid 1=400 的中位数)

于 2015-05-28T09:52:36.933 回答