Ssas Mdx中值查询

Ssas Mdx中值查询,ssas,mdx,median,Ssas,Mdx,Median,在这个mdx查询中可能真的需要某人的帮助。我正试图为每个用户和每天生成过去365天的滚动中值。我需要的中位数是每个用户响应天数的中位数。这似乎是一个简单的计算,但我看不出如何让它与混合中的交叉连接一起工作。任何帮助都将不胜感激!如果你甚至有一个方向的建议,攻击这将是伟大的 SET [2Years] AS '{[FirstOrderDate].[Full Date].&[2010-01-15T00:00:00]:[FirstOrderDate].[Full Date].[2012-08-2

在这个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]
提前感谢您的帮助

编辑:


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

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日的第一天有两个项目,一个是吉姆的1/3,另一个是弗雷德的1/3。因此,在中位数计算中,需要使用相关集合中每个项目的响应天数。由于1/3是列表日期中的排名1,因此将检索名为RP1的集合,并结合集合中项目(Jim和Fred)的响应天数,计算中值。然后下一个日期,1/4,包含三个项目-与1/3相同,但现在也包含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

MedianResponseDays
度量对用户进行迭代,以计算从给定日期到当前日期的
响应天数的中值。我把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]

我有一个事实表fct\u line\u details,有两列mtid和productivity

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

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

感谢您抽出时间查看此Stacia。我真的很尊重你的工作。我知道我并不孤单。我明白你的意思了,这是个棘手的问题。我想不起来,所以我很感激你帮我一把。但是,当我运行查询时,这是否可能是在为每个用户计算后续364天的平均[响应天数],而不是为所有用户计算后续364天的平均[响应天数]?[滞后中值]等于[响应天数]。用户ID日期响应天数中位数滞后87921 1/7/2011 2439 2439 89390 1/7/2011 2405 2405 95330 1/21/2011 2333 2333 96260 1/20/2011 2319 2319抱歉-基于您的陈述“我正在尝试根据每个用户和每天的基础生成过去365天的滚动中位数”我想你的意思是你想在评估一组日期的中值时只考虑当前用户。我用一个替代查询更新了我的答案,该查询忽略了当前用户,只考虑中值的日期。如果我仍然不正确,请澄清您试图实现的目标。对不起,我没有很好地描述这一点。然而,我认为这非常接近。我对你感激不尽。假设我们只有5个用户的数据,也许一个例子可以最好地描述这一点。(吉姆,回复日期:10,回复日期:03年1月,回复日期:10),(弗雷德,回复日期:20,回复日期:03年1月,回复日期:15),(弗兰克,回复日期:30,回复日期:04年1月,回复日期:20),(莎莉,回复日期:18,回复日期:05年1月,回复日期:19),(琼,回复日期:26,回复日期:06年1月,回复日期:20)MedianLag是为每个用户每天提供的,可以追溯到364年前days@Ryan你能提供一个数据样本和你期望得到的结果吗?是的,我在上一篇文章中试图提供一些样本数据,medianLag向@stacia展示了我想要的输出,但我的字符有限。我会做得更好,很快给你一些样本数据。可能需要在两个帖子之间进行拆分。非常感谢。您能解释一下这些日期的
MedianResponseDays
吗:
2001-01-05
2001-01-16
2001-01-17
?对于'2001-01-05',我们有一个后续3天的排序列表(10、18、30、80)。因为这是一个偶数,我们必须取中间的两个数除以2。(18+30)/2=24对于'2001-01-16',我们有一个连续14天的排序列表(9,10,15,18,26,29,30,80)。因为这是一个偶数,我们必须取中间的两个数除以2。(18+26)/2=22对于'2001-01-17',我们有一个连续15天的排序列表(9,10,15,18,26,29,30,80200)。因为这是一个奇数,我们可以取中间数。谢谢你看这个问题,贝诺特。如果你没有帮我收集一个好的样本/例子来说明我在寻找什么,它可能就不会得到解决。
  mtid     productivity
  ----     ------------
  1        400
  1        200
  1        600
  2        700
  3        900