带有NON EMPTY子句的MDX日期范围不会对该范围的数据进行切片

时间:2015-06-09 07:31:44

标签: mdx pentaho date-range mondrian

我正在努力优化查询时间。但在我的情况下,case 1case 2返回相同的结果。 case 1应该返回特定数据范围的结果,即[time].[2015].[5].[10] : [time].[2015].[6].[9],而不是[time].[2015].[6].[9]仅返回case 2的结果。 case 1返回正确的结果,即范围的数据,但仅当您删除非空子句时。删除非空子句意味着它将搜索再次占用大量时间的整个数据集。再次case 3返回正确的结果,但操作比第一种方法更多的时间。任何人都面临这样的问题,或者可以指导我解决这个问题。

案例1

WITH 
  MEMBER [Measures].[abc_type] AS 
    [abc].CurrentMember.Properties("abc_type") 
  MEMBER [Measures].[abc_desc] AS 
    [abc].CurrentMember.Properties("abc_desc") 
  MEMBER [Measures].[abc_class] AS 
    [abc].CurrentMember.Properties("abc_class") 
SELECT 
  NON EMPTY 
    {
      [Measures].[abc_type]
     ,[Measures].[abc_desc]
     ,[Measures].[abc_class]
    } ON COLUMNS
 ,NON EMPTY 
    Filter
    (
      {[abc].[abc_id].MEMBERS}
     ,St_contains
      (
        [district].[district_id].[1].Properties("the_geom")
       ,[abc].CurrentMember.Properties("the_geom")
      )
    ) ON ROWS
FROM [analytics_cube]
WHERE 
  [time].[2015].[5].[10] : [time].[2015].[6].[9];

案例2

WITH 
  MEMBER [Measures].[abc_type] AS 
    [abc].CurrentMember.Properties("abc_type") 
  MEMBER [Measures].[abc_desc] AS 
    [abc].CurrentMember.Properties("abc_desc") 
  MEMBER [Measures].[abc_class] AS 
    [abc].CurrentMember.Properties("abc_class") 
SELECT 
  NON EMPTY 
    {
      [Measures].[abc_type]
     ,[Measures].[abc_desc]
     ,[Measures].[abc_class]
    } ON COLUMNS
 ,NON EMPTY 
    Filter
    (
      {[abc].[abc_id].MEMBERS}
     ,St_contains
      (
        [district].[district_id].[1].Properties("the_geom")
       ,[abc].CurrentMember.Properties("the_geom")
      )
    ) ON ROWS
FROM [analytics_cube]
WHERE 
  [time].[2015].[6].[9];

案例3

WITH 
  MEMBER [Measures].[abc_type] AS 
    [abc].CurrentMember.Properties("abc_type") 
  MEMBER [Measures].[abc_desc] AS 
    [abc].CurrentMember.Properties("abc_desc") 
  MEMBER [Measures].[abc_class] AS 
    [abc].CurrentMember.Properties("abc_class") 
  MEMBER [time].[newtime] AS 
    Aggregate([time].[2015].[5].[10] : [time].[2015].[6].[9]) 
SELECT 
  NON EMPTY 
    {
      [Measures].[abc_type]
     ,[Measures].[abc_desc]
     ,[Measures].[abc_class]
    } ON COLUMNS
 ,NON EMPTY 
    Filter
    (
      {[abc].[abc_id].MEMBERS}
     ,St_contains
      (
        [district].[district_id].[1].Properties("the_geom")
       ,[abc].CurrentMember.Properties("the_geom")
      )
    ) ON ROWS
FROM [analytics_cube]
WHERE 
  [time].[newtime];

1 个答案:

答案 0 :(得分:0)

时间范围始终由Mondrian评估为全级扫描。它将加载给定时间级别的所有成员,并将开始迭代成员,直到找到第一个绑定。然后它将创建一个子列表,直到该范围的最后一个成员。

提交了一个增强请求,将范围转换为SQL谓词here

如果您有机会测试原型代码,请告诉我们它是如何工作的