Ssas 每个事务的MDX开始和结束时间

Ssas 每个事务的MDX开始和结束时间,ssas,mdx,cubes,Ssas,Mdx,Cubes,我希望你能帮助我,我已经尝试了很多方法,但都没有成功。我正在尝试获取玩家帐号、日期、开始和结束日期时间,并可能计算开始和结束时间之间的游戏持续时间 我希望输出像这样 玩家帐号|游戏日期|开始时间|结束时间|游戏持续时间|实际时间 我似乎总是返回一整天的开始和结束时间,而不是每个帐户 WITH SET [MySet] AS [Customer].[Player Account Number].Children* Head ( NonEm

我希望你能帮助我,我已经尝试了很多方法,但都没有成功。我正在尝试获取玩家帐号、日期、开始和结束日期时间,并可能计算开始和结束时间之间的游戏持续时间

我希望输出像这样

玩家帐号|游戏日期|开始时间|结束时间|游戏持续时间|实际时间

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

 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]};

您有一个静态集(总是返回相同的成员)。使用
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];

您有一个静态集(总是返回相同的成员)。使用
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];

通常,第一个日期和最后一个日期都是度量值。如果您只想要这两个玩家的结果,请使用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];
如果您希望撤回一个成员而不是使用度量,我认为
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];

通常,第一个日期和最后一个日期都是度量值。如果您只想要这两个玩家的结果,请使用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];
如果您希望撤回一个成员而不是使用度量,我认为
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];

感谢万分之三的原因。第(0)项。第(0)项。会员的标题让一切都不同了。结果似乎马上就出来了。最终的解决方案现在看起来是这样的

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]
    }

感谢万分之三的原因。第(0)项。第(0)项。会员的标题让一切都不同了。结果似乎马上就出来了。最终的解决方案现在看起来是这样的

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]
    }


我想你需要在
[Customer].[Player Account Number]周围放置
现有的
。孩子们
不在日期上,因为他们没有被分割。我对使用
现有的
很陌生,但我知道它会将cellset上下文拉到
WITH
子句中-因此我添加了
[Customer].[Player Account Number].children
进入单元集中,然后使用
现有的
将该上下文拉入
WITH
子句?我将对此进行回顾并进行回复。我已尝试从您的两个示例中添加现有的,但仍然得到相同的结果,我确信这与我的集合有关,但在这里完全丢失了,对MDX来说非常陌生,那就容易多了TSql@smckechnie-我的第一个脚本是垃圾,因为刚刚对AdvWrks进行了测试,所以我删除了它。我正在测试第二个。我想你需要在
[Customer].[Player Account Number]周围放置
现有的
。孩子们
不在日期上,因为他们没有被切片。我不熟悉使用
现有的
,但我知道它会将单元集上下文拉到
WITH
子句中-因此我添加了
[Customer]。[玩家帐号].children
进入单元集中,然后使用
现有的
将该上下文拉入
WITH
子句?我将对此进行回顾并进行回复。我已尝试从您的两个示例中添加现有的,但仍然得到相同的结果,我确信这与我的集合有关,但在这里完全丢失了,对MDX来说非常陌生,太多了席尔TSql@smckechnie-我的第一个脚本是垃圾,因为刚刚针对AdvWrks进行了测试,所以我已将其删除。我正在测试第二个脚本。请检查我的尝试。@Sourav_Agasti我对这种方法有点不确定-传统上,firstdates或lastdate或lastdatesWithdata是使用
[度量]完成的
。因此,虽然很有趣,但我认为最好不要使用自定义设置?你绝对是对的。理想情况下,我们应该有措施来完成这项工作。这就是为什么我的方法也不起作用的原因。我在回答中添加的AdvWrks措施方法工作请检查我的尝试。@Sourav\u Agasti我对这种方法有点不确定-traditi所有firstdates或lastdates,或lastdatesWithdata都是使用
[度量]完成的
。虽然很有趣,但我认为最好不要使用自定义设置?你绝对是对的。理想情况下,我们应该有措施来完成这项工作。这就是为什么我的方法也不起作用的原因。我在回答中添加的AdvWrks措施方法worksThank@Sourav_Agasti。如果我有一个玩家帐户,解决方案会非常有效,b但是,当a有一个帐户列表时,它会返回整个列表的第一个小时和整个列表的最后一个小时,而不是每个玩家帐户的最后一个小时。如果你想玩它,我有一个相当于你脚本的AdvWrks?(如果你愿意,我可以添加到你的答案中?)…我很想知道您是否可以使用这种方法。@Sourav您编辑的代码在measures@Sourav_Agasti-我已经添加了AdvWrks模型的简化版本。如果你能让它正常工作,那就好了-我认为这是一个比使用
member\u caption
@smckechnie更快的解决方案-我忘了添加
项(0).ITEM(0)
。已添加相同的now谢谢@Sourav\u Agasti。如果我有一个玩家帐户,解决方案会非常有效,但a有帐户列表时,它会返回e的第一个小时