Saiku查询设定:Saiku查询数据时,每次都是全量查询的,我们现在需要默认展示近一周的数据。

通过编写使用MDX表达式进行过滤

通过编写MDX表达式,添加新的指标信息对一周以内的数据进行标识 (其实我也想添加新的维度信息,但是好像不生效,所以就用指标了)

  1. /** 检测日期的差值,小于7 */
  2. IIf(DateDiff("d",CDate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name), now())> 7, "yes", "no")
  3.  
  4. /** 检测日期差值大于0并且小于7 (显示最近一周的数据) 但是其他年份的相同月份的数据也会显示出来*/
  5. IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7,
  6. IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0,"週數據","非週數據"),"非週數據")
  7.  
  8. //处理不同年份的日期差值问题(固定年份差值为0,表示只判定当年的数据) year(now()) 取的值为2019
  9. IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7,
  10. IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0,
  11. IIF( year(cdate(now())) - year(cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))=0,"週數據","非週數據"),"非週數據"),"非週數據")

其中SaikuUseDate是我自定义的日期维度信息,在schame中的定义如下:

  1.     <Dimension name="SaikuUseDate" foreignKey="ID" >
  2. <Hierarchy hasAll="true" primaryKey="ID" allMemberName="SaikuUseDate">
  3.   <Level name="SaikuUseDate" column="saikuUseDate" type='Date' uniqueMembers="false" />
  4. </Hierarchy>
  5. </Dimension>

  

区分最近一周数据与其他数据最终的MDX表达式语句为:

  1. IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7,
  2.   IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0,
  3.     IIF( year(cdate(now())) - year(cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))=0,"週數據","非週數據"),
      "非週數據"),
    "非週數據")

saiku中添加新的指标信息如下:

根据新指标信息查询结果如下:

数据已筛选好了,接下来只需要把 新指标  週數據 字段按照 週數據 與 非週數據 进行筛选就可以啦。

(目前因为saiku是社区版的,过滤不起作用所以没法演示了,后期如果解决了过滤问题会更新的)

 

=============更新关于过滤===================终于把过滤问题处理好了============== start

>>>>>>首先我们学习一下MDX语句进行数据过滤:

1.登录saiku,选中指定cube

2. 选择上方的工具栏中的 MDX模式  (表示根据MDX语句查询数据,直接将MDX语句写好然后点击 执行按钮 去执行就可以了【有个问题就是好像MDX模式无法切换到普通的拖拽模式】)

3. MDX表达式语句如下: (目的:根据日期筛选出近一周的数据)

语句1:

WITH
MEMBER [Measures].[周数据筛选] AS
  IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7 
  AND datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0 
  AND year(cdate(now())) - year(cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))=0,"週數據","非週數據")

SET [~ROWS] AS {FILTER([SaikuUseDate].[SaikuUseDate].[SaikuUseDate].Members,[Measures].[周数据筛选]="週數據")}
SELECT
NON EMPTY {[Measures].[周数据筛选], [Measures].[daycount]} ON COLUMNS,
NON EMPTY [~ROWS] ON ROWS
FROM [rs_nbjc_1_1]

或使用如下MDX表达式进行过滤(这两条语句的结果一样,但是第二条语句将过滤表达式作为条件放入where后面,使得查询的效率提高  推荐使用语句2

语句2:

  1. WITH
  2. SET [~filterByDate] AS
  3. Filter({[SaikuUseDate].[SaikuUseDate].[SaikuUseDate].Members},
  4. Instr(IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7 AND
  5.   datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0 AND
  6.   year(cdate(now())) - year(cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))=0,"yes","no"),"yes") > 0)
  7. SET [~ROWS] AS {[countdate].[countdate].[countdate].Members}
  8. SELECT
  9. NON EMPTY { [Measures].[daycount]} ON COLUMNS,
  10. NON EMPTY [~ROWS] ON ROWS
  11. FROM [rs_nbjc_1_1]
  12. where [~filterByDate]

schame文件中 cube名为  rs_nbjc_1_1  的设计如下:

  1. <!-- rs_nbjc_1_1 用來做MDX FILTER表達式的測試 -->
  2. <Cube name="rs_nbjc_1_1">
  3.  
  4. <Table name="rs_nbjc_1_1" />
  5.       <Dimension name="SEQID" foreignKey="ID" >
  6.         <Hierarchy hasAll="true" primaryKey="ID" allMemberName="SEQID" >
  7.           <Level name="SEQID" column="ID" uniqueMembers="true" type="String" />
  8.         </Hierarchy>
  9.       </Dimension>
  10.  
  11. <Dimension name="countdate" foreignKey="ID" >
  12. <Hierarchy hasAll="true" primaryKey="ID" allMemberName="countdate">
  13.   <Level name="countdate" column="countdate" type='Date' uniqueMembers="false" />
  14. </Hierarchy>
  15. </Dimension>
  16.  
  17. <Dimension name="SaikuUseDate" foreignKey="ID" >
  18. <Hierarchy hasAll="true" primaryKey="ID" allMemberName="SaikuUseDate">
  19.   <Level name="SaikuUseDate" column="saikuUseDate" type='Date' uniqueMembers="false" />
  20. </Hierarchy>
  21. </Dimension>
  22.  
  23. <Measure name="daycount" column="daycount" aggregator="sum" />
  24.  
  25. </Cube>

  

>>>>>>使用SAIKU的MDX表达式过滤

1. 过滤的使用与日常拖拉数据一样,但是记得将需要过滤的字段放入过滤栏位

2. 在过滤这个位置 左击鼠标,然后依次选中 过滤  >>>  Custom

3.进入编写MDX过滤表达式弹窗

 过滤表达式内容如下:

  1. Instr(
  2. IIF(datediff("y",cdate(now()),cdate([countdate].[countdate].CurrentMember.Name))<=7
  3. AND datediff("y",cdate(now()),cdate([countdate].[countdate].CurrentMember.Name))>=0
  4. AND year(cdate(now())) - year(cdate([countdate].[countdate].CurrentMember.Name))=0,"yes","no"),"yes")>0

4. 点击ok后,如果取消了自动查询就手动点击一下查询按钮,执行查询后可看到如下结果:(结果数据以及被过滤,取的是近一周的数据,当前日期为 2019-02-28)

ps:  在这里笔者遇到了一个很神奇的问题,在本地部署的Saiku中使用CDate函数没有任何问题,但是部署到服务器上使用CDate函数时,抛出异常:

  1. #ERR: mondrian.olap.fun.MondrianEvaluationException: mondrian.olap.InvalidArgumentException: Mondrian Error:Invalid parameter. expression parameter of CDate function must be formatted correctly (2016-05-21)

解决方案:  不使用CDate函数了,使用DateSerial函数将数据转为Date类型

转换将String类型的日期数据转换为Date日期类型示例:

CDate:   CDate([countdate].[countdate].CurrentMember.name)

DateSerial:    DateSerial(cast(left([countdate].[countdate].CurrentMember.name,4) as Integer),cast(mid([countdate].[countdate].CurrentMember.name,6,2) as Integer),cast(mid([countdate].[countdate].CurrentMember.name,9,2) as Integer)) 

过滤表达式内容如下:

  1. Instr(
  2. IIF(datediff("y",cdate(now()),DateSerial(cast(left([countdate].[countdate].CurrentMember.name,4) as Integer),
  3. cast(mid([countdate].[countdate].CurrentMember.name,6,2) as Integer),
  4. cast(mid([countdate].[countdate].CurrentMember.name,9,2) as Integer))
  5. )<7
  6. AND datediff("y",cdate(now()),DateSerial(cast(left([countdate].[countdate].CurrentMember.name,4) as Integer),
  7. cast(mid([countdate].[countdate].CurrentMember.name,6,2) as Integer),
  8. cast(mid([countdate].[countdate].CurrentMember.name,9,2) as Integer))
  9. )>=0
  10. AND year(cdate(now())) - cast(left([countdate].[countdate].CurrentMember.name,4) as Integer)=0,"yes","no"),"yes")>0

关于过滤二次更新了

1.过滤出上个月的完整数据,以及当前月的月数据(特殊情况下考虑跨年的数据,当前月份为1月时需要特殊处理)

展示需求:默认展示上一个月完整数据以及当前月的月数据 (起始日期:上个月的第一天,结束日期: 当前天)

处理逻辑: 判断当前月是否为1月,如果是1月则特殊处理:取出去年12月份的数据,然后再加上本年1月出现的所有数据。

      如果不是1月,则用当前日期减去一个月,取上个月的第一天作为起始日期,然后当前日期作为结束日期,作比较即可(保证年份相同)。

  1. IIF(
  2. month(now())-1 = 0
  3. , (
  4. datediff('y',dateserial(year(now())-1,12,01) , DateSerial(cast(left([countdate].[countdate].CurrentMember.name,4) as Integer) ,
  5. cast(mid([countdate].[countdate].CurrentMember.name,6,2) as Integer),
  6. cast(mid([countdate].[countdate].CurrentMember.name,9,2) as Integer)))<0
  7. and year(now())-1 - cast(left([countdate].[countdate].CurrentMember.name,4) as Integer) =0
  8. )
  9. or
  10. (
  11. datediff("y" ,DateSerial(cast(left([countdate].[countdate].CurrentMember.name,4) as Integer),
  12. cast(mid([countdate].[countdate].CurrentMember.name,6,2) as Integer),
  13. cast(mid([countdate].[countdate].CurrentMember.name,9,2) as Integer)),now()) <=0
  14. and
  15. year(now()) - cast(left([countdate].[countdate].CurrentMember.name,4) as Integer)=0
  16. )
  17. ,
  18. (
  19. datediff("y" ,DateSerial(year(now()),month(now())-1,01) ,DateSerial(cast(left([countdate].[countdate].CurrentMember.name,4) as Integer),
  20. cast(mid([countdate].[countdate].CurrentMember.name,6,2) as Integer),
  21. cast(mid([countdate].[countdate].CurrentMember.name,9,2) as Integer))) <= 0
  22. and
  23. datediff("y" ,DateSerial(cast(left([countdate].[countdate].CurrentMember.name,4) as Integer),
  24. cast(mid([countdate].[countdate].CurrentMember.name,6,2) as Integer),
  25. cast(mid([countdate].[countdate].CurrentMember.name,9,2) as Integer)), now()) <=0
  26. and
  27. year(cdate(now())) - cast(left([countdate].[countdate].CurrentMember.name,4) as Integer)=0
  28. )
  29. )

  

2.过滤周数据:展示本周的所有数据 (注意跨年份的周数据)

展示需求:默认展示最近的周一到目前的所有数据

处理逻辑:

  先取出所有数据中与当前日期相同的周的数据

  控制取出的数据是本年的或者是上一年12月份的数据

  1. Datepart('ww',now()) = Datepart('ww',
  2. DateSerial(cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer),
  3. cast(mid([saikuUseDate].[saikuUseDate].CurrentMember.name,6,2) as Integer),
  4. cast(mid([saikuUseDate].[saikuUseDate].CurrentMember.name,9,2) as Integer)))
  5. and (
  6. (year(now()) = cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer))
  7. or
  8. ((year(now()) - cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer)=1))
  9. )
  10.  
  11. and
  12. instr(
  13. IIF(cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer) = (YEAR(now())-1)
  14. ,(
  15. iif((datediff('y',DateSerial(cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer),
  16. cast(mid([saikuUseDate].[saikuUseDate].CurrentMember.name,6,2) as Integer),
  17. cast(mid([saikuUseDate].[saikuUseDate].CurrentMember.name,9,2) as Integer)),
  18. Dateserial(year(now())-1,12,01))>0)
  19. and (cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer) =(YEAR(now())-1))
  20. ,"yes","no")
  21. )
  22. ,"yes"
  23. ),"yes")>0

=============更新关于过滤===================终于把过滤问题处理好了============== end

ps: 使用过滤表达式后,记得先取消saiku的自动执行哦,然后将用到的数据信息都拖拽好,过滤信息也编写好,最后在手动点击执行!!!(不然每拖拽一次都要执行一遍,很比较浪费内存哦。)

Saiku关于MDX过滤的使用(九)的更多相关文章

  1. saiku中文查询(鉴于有人提问:saiku执行mdx,有中文报错)

    有人问我saiku的中文查询问题: saiku默认执行英文,很多人,在mysql里录入了中文,使用sql语言查询没有问题. 可是,用saiku的mdx查询,就会报错. 这是因为mysql默认支持中文查 ...

  2. 服务器抓包命令:tcpdump详解

    官网地址:http://www.tcpdump.org/tcpdump_man.html 简介: tcpdump,就是:dump the traffic on a network,根据使用者的定义对网 ...

  3. Linux常用命令 day day up系列3

    一.命令执行的优先级二.Linux目录结构三.cat--查看文件内容四.more--查看文件内容五.less--查看文件内容六.head.tail--查看文件内容七.wc--统计文件内容八.grep- ...

  4. ApacheCN 计算机视觉译文集 20211110 更新

    OpenCV3 和 Qt5 计算机视觉 零.前言 一.OpenCV 和 Qt 简介 二.创建我们的第一个 Qt 和 OpenCV 项目 三.创建一个全面的 Qt + OpenCV 项目 四.Mat和Q ...

  5. ApacheCN 数据科学译文集 20211109 更新ApacheCN 数据科学译文集 20211109 更新

    计算与推断思维 一.数据科学 二.因果和实验 三.Python 编程 四.数据类型 五.表格 六.可视化 七.函数和表格 八.随机性 九.经验分布 十.假设检验 十一.估计 十二.为什么均值重要 十三 ...

  6. ApacheCN 数据科学译文集 20210313 更新

    新增了五个教程: Python 和 Jupyter 机器学习入门 零.前言 一.Jupyter 基础知识 二.数据清理和高级机器学习 三.Web 爬取和交互式可视化 Python 数据科学和机器学习实 ...

  7. ApacheCN 计算机视觉译文集 20210203 更新

    新增了五个教程: OpenCV3 和 Qt5 计算机视觉 零.前言 一.OpenCV 和 Qt 简介 二.创建我们的第一个 Qt 和 OpenCV 项目 三.创建一个全面的 Qt + OpenCV 项 ...

  8. Saiku更改導出文件的文件名(十九)

    Saiku更改導出文件的文件名 Saiku查询完数据之后,可以以excel,pdf,csv等格式将数据导出,这里我们来讲一下怎么更改导出的文件名. 找到对应的导出方法所在的js文件: saiku-se ...

  9. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

随机推荐

  1. Go 初体验 - channel.2 - 超时机制

    channel 虽然很好用,但是我们也要考虑异常情况,比如:超时 go 语言怎么解决这个超时问题呢? 可以利用 select 语句: select 的用法与 switch 语言非常类似,由 selec ...

  2. VCS

    timing check相关的, +notimingcheck命令,可以用在compile时,也可以用在run time的时候, 都是将检查timing的系统函数,都disable掉了, 加在comp ...

  3. SQL Prompt snippets

    SQL    Prompt snippets https://github.com/gvohra/sqlpromptsnippets

  4. 【Spark-core学习之三】 Spark集群搭建 & spark-shell & Master HA

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  5. mysql 事务锁超时时间 innodb_lock_wait_timeout

    mysql 事务锁超时时间 innodb_lock_wait_timeout: # 查询全局等待事务锁超时时间 SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait ...

  6. FAT32文件系统学习(上)

    2011-06-02 22:30:48 目的:需要编写SD读图片的底层驱动程序.所以要了解一个SD卡常用文件系统基本概念.累计学习用时2.5小时. 一,FAT32的保留区 1,引导扇区 :引导扇区是F ...

  7. Oarcle的开始

    1.数据库大致分类两种 1.关系型数据库(SQL) Oracle.Mysql(80%).DB2.Microsoft SQL Server.ProsgreSQL.Access.SQLSite 2.非关系 ...

  8. JavaScript eval

    JavaScript  eval JavaScript中的eval是Python中eval和exec的合集,既可以编译代码也可以获取返回值. // EvalError 执行字符串中的JavaScrip ...

  9. TCP之种种连接异常

    1. connect出错: (1) 若TCP客户端没有收到syn分节的响应,则返回ETIMEOUT错误:调用connect函数时,内核发送一个syn,若无响应则等待6s后再发送一个,若仍然无响应则等待 ...

  10. MIME类型解析

    MIME(Multipurpose Internet Mail Extensions)多用途网络邮件扩展类型,可被称为Media type或Content type, 它设定某种类型的文件当被浏览器打 ...