【问题标题】:MDX Start and End Time per transaction每个事务的 MDX 开始和结束时间
【发布时间】:2015-03-13 07:57:36
【问题描述】:

我希望你能帮助我已经尝试了很多方法来尝试做到这一点,但没有运气。我正在尝试获取玩家帐号的日期以及开始和结束日期时间,并可能计算开始和结束时间之间的播放持续时间。

我希望输出看起来像这样。

玩家账户 |游戏日期 |开始时间 |结束时间 |播放时长 |实际赢

我似乎总是返回一整天的开始和结束时间,而不是每个帐户。

 WITH 
  SET [MySet] AS 
      [Customer].[Player Account Number].Children*
      Head
      (
        NonEmpty
        (
          [Start Time].[Hour].Children
         ,[Measures].[Actual Win]
        )
       ,1
      )*
      Tail
      (
        NonEmpty
        (
          [End Time].[Hour].Children
         ,[Measures].[Actual Win]
        )
       ,1
      ) 
SELECT 
  {[Measures].[Actual Win]} ON 0
 ,{[MySet]} ON 1
FROM 
(
  SELECT 
      [Customer].[Player Account Number].&[1040002184]
    : 
      [Customer].[Player Account Number].&[1040002198] ON 0
  FROM Ratings
)
WHERE 
  {[Gaming Date].[Full Date].&[20150101]};

【问题讨论】:

  • 请检查我的尝试。
  • @Sourav_Agasti 我对这种方法有点不确定——传统上,firstdates 或 lastdates,或 lastdatesWithdata 是使用 [MEASURES] 完成的。所以虽然很有趣,但我认为最好不要使用自定义集?
  • 你是绝对正确的伙伴。理想情况下,我们应该有措施来完成这项工作。这就是为什么我的方法也不起作用的原因。
  • 我在回答作品中添加的 AdvWrks 措施方法

标签: ssas mdx cubes


【解决方案1】:

通常第一个日期和最后一个日期是度量值。如果您只想要这两个玩家的结果,请使用 WHERE 子句而不是子选择:

WITH 
  MEMBER [Measures].[fDate] AS 
    Head
    (
      NonEmpty
      (
        [Start Time].[Hour].MEMBERS
       ,[Measures].[Actual Win]
      )
    ).Item(0).Item(0).Member_Caption 
  MEMBER [Measures].[lDate] AS 
    Tail
    (
      NonEmpty
      (
        [End Time].[Hour].MEMBERS
       ,[Measures].[Actual Win]
      )
    ).Item(0).Item(0).Member_Caption 
SELECT 
  {
    [Measures].[fDate]
   ,[Measures].[lDate]
   ,[Measures].[Actual Win]
  } ON 0
 ,{[Customer].[Player Account Number].Children} ON 1
FROM Ratings
WHERE 
  ([Gaming Date].[Full Date].&[20150101],
   { [Customer].[Player Account Number].&[1040002184]
    ,[Customer].[Player Account Number].&[1040002198]});

这是一个有效的 AdvWrks 脚本,它可以完成您想要实现的事情:

WITH 
  MEMBER [Measures].[firstDate] AS 
    Head
    (
      NonEmpty
      (
        [Date].[Date].[Date].MEMBERS
       ,[Measures].[Internet Sales Amount]
      )
    ).Item(0).Item(0).Member_Caption 
  MEMBER [Measures].[lastDate] AS 
    Tail
    (
      NonEmpty
      (
        [Date].[Date].[Date].MEMBERS
       ,[Measures].[Internet Sales Amount]
      )
    ).Item(0).Item(0).Member_Caption 
SELECT 
  {
    [Measures].[Internet Sales Amount]
   ,[Measures].[firstDate]
   ,[Measures].[lastDate]
  } ON 0
 ,NON EMPTY {[Promotion].[Promotion].MEMBERS} ON 1
FROM [Adventure Works];

如果您宁愿撤回成员而不是使用Measures,我认为GENERATE 函数将像这个AdvWrks 示例一样工作:

WITH 
  SET [aSet] AS 
    Generate
    (
      [Promotion].[Promotion].MEMBERS
     ,
        [Promotion].[Promotion].CurrentMember
      * 
        Head
        (
          NonEmpty
          (
            [Date].[Date].[Date].MEMBERS
           ,[Measures].[Internet Sales Amount]
          )
        )
    ) 
SELECT 
  {[Measures].[Internet Sales Amount]} ON 0
 ,NON EMPTY 
    {[aSet]} ON 1
FROM [Adventure Works];

【讨论】:

  • 我猜你需要在 [Customer].[Player Account Number].children 周围加上 EXISTING 而不是日期,因为它们没有被切片。
  • 我不熟悉使用EXISTING,但我知道它将单元集上下文拉入WITH 子句 - 所以我将[Customer].[Player Account Number].children 添加到单元集中,然后使用EXISTING将该上下文拉入WITH 子句?
  • 我会对此进行审查并发表评论。
  • 我已经尝试从你的两个示例中添加现有的,但我仍然得到相同的结果,我确定它与我的集合有关,但在这里完全丢失了,对于 MDX 来说非常新,容易多了TSql
  • @smckechnie - 我的第一个脚本是垃圾,因为刚刚针对 AdvWrks 进行了测试,所以我删除了它。我正在测试第二个。
【解决方案2】:

感谢一百万Whytheq 似乎是 .Item(0).Item(0).Member_Caption 带来了所有不同,结果似乎现在就出来了。最终的解决方案现在看起来像这样..

with set [MySet]
as
[Casino Hierarchy].[Casino Key].children *
[Gaming Date].[Date].currentmember * 
[Customer].[Player Account Number].children *
[Start Time].[Hour].children

member [measures].[Mindate]
as
HEAD(nonempty([End Time].[Hour].children,[Measures].[Actual Win]),1).Item(0).Item(0).Member_Caption 

member [measures].[Maxdate]
as
TAIL(nonempty([Start Time].[Hour].children,[Measures].[Actual Win]),1).Item(0).Item(0).Member_Caption 

    select non empty
    {
    [Measures].[Actual Win],[measures].[Mindate],[measures].[Maxdate]
    } on 0, non empty
    { 
    [Customer].[Player Account Number].children
    } on 1
    from
    (
    select  ([Customer].[Player Account Number].&[1040002184]:[Customer].[Player Account Number].&[1040002198])  on 0 from Ratings
    )
    where 
    {
    [Gaming Date].[Full Date].&[20150101]
    }

【讨论】:

    【解决方案3】:

    你有一个静态集合(它总是返回相同的成员)。使用EXISTING 关键字来评估当前上下文中的开始时间和结束时间。

    with member [Measures].[StartDate] as
    
        EXISTING    
        HEAD(
                nonempty(
                        [Start Time].[Hour].Children,[Measures].[Actual Win]
                        ) ,1
            ).ITEM(0).ITEM(0).MEMBERVALUE
    
    
    
    member [Measures].[EndDate] as
        EXISTING
        TAIL(
                nonempty(
                        [End Time].[Hour].children,[Measures].[Actual Win]
                        ) ,1            
            ).ITEM(0).ITEM(0).MEMBERVALUE       
    
    
    select 
        {
        [Measures].[Actual Win], 
        [Measures].[StartDate], 
        [Measures].[EndDate]
        } on 0,
    
        [Customer].[Player Account Number].children on 1
    
    from
    (
        select  (
                [Customer].[Player Account Number].&[1040002184]:
                [Customer].[Player Account Number].&[1040002198]
                )  on 0 
        from Ratings
    )
    
    where {[Gaming Date].[Full Date].&[20150101]}
    

    重新排列了[Customer].[Player Account Number],以便在每个玩家帐户的上下文中评估日期。希望没事!

    编辑。

    这种方法的简化 AdWrks 版本如下:仍然无法正常工作:

    WITH 
      SET [aSet] AS 
        (EXISTING 
          Head
          (
            NonEmpty
            (
              [Date].[Date].[Date].MEMBERS
             ,[Measures].[Internet Sales Amount]
            )
          )) 
    SELECT 
      {[Measures].[Internet Sales Amount]} ON 0
     ,NON EMPTY 
        {[Promotion].[Promotion].MEMBERS * [aSet]} ON 1
    FROM [Adventure Works];
    

    【讨论】:

    • 感谢@Sourav_Agasti。如果我有一个玩家帐户,该解决方案可以完美运行,但是当我有一个帐户列表时,它会返回整个列表的第一个小时和整个列表的最后一个小时,而不是每个玩家帐户
    • sourav - 如果你想玩它,我有一个相当于你的脚本的 AdvWrks? (如果您愿意,我可以添加到您的答案中?)...我很想知道您是否可以使用这种方法。
    • @Sourav 您编辑的代码在度量中返回错误
    • @Sourav_Agasti - 我添加了 AdvWrks 模型的简化版本。如果你能做到这一点,那就太好了 - 我认为比使用 member_caption 更快的解决方案。
    • @smckechnie - 我忘了添加ITEM(0).ITEM(0)。现在已经添加了相同的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2016-09-24
    • 2018-11-07
    相关资源
    最近更新 更多