Saiku关于MDX过滤的使用(九)
Saiku查询设定:Saiku查询数据时,每次都是全量查询的,我们现在需要默认展示近一周的数据。
通过编写使用MDX表达式进行过滤
通过编写MDX表达式,添加新的指标信息对一周以内的数据进行标识 (其实我也想添加新的维度信息,但是好像不生效,所以就用指标了)
- /** 检测日期的差值,小于7 */
- IIf(DateDiff("d",CDate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name), now())> 7, "yes", "no")
- /** 检测日期差值大于0并且小于7 (显示最近一周的数据) 但是其他年份的相同月份的数据也会显示出来*/
- IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7,
- IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0,"週數據","非週數據"),"非週數據")
- //处理不同年份的日期差值问题(固定年份差值为0,表示只判定当年的数据) year(now()) 取的值为2019
- IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7,
- IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0,
- IIF( year(cdate(now())) - year(cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))=0,"週數據","非週數據"),"非週數據"),"非週數據")
其中SaikuUseDate是我自定义的日期维度信息,在schame中的定义如下:
- <Dimension name="SaikuUseDate" foreignKey="ID" >
- <Hierarchy hasAll="true" primaryKey="ID" allMemberName="SaikuUseDate">
- <Level name="SaikuUseDate" column="saikuUseDate" type='Date' uniqueMembers="false" />
- </Hierarchy>
- </Dimension>
区分最近一周数据与其他数据最终的MDX表达式语句为:
- IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7,
- IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0,
- 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:
- WITH
- SET [~filterByDate] AS
- Filter({[SaikuUseDate].[SaikuUseDate].[SaikuUseDate].Members},
- Instr(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,"yes","no"),"yes") > 0)
- SET [~ROWS] AS {[countdate].[countdate].[countdate].Members}
- SELECT
- NON EMPTY { [Measures].[daycount]} ON COLUMNS,
- NON EMPTY [~ROWS] ON ROWS
- FROM [rs_nbjc_1_1]
- where [~filterByDate]
schame文件中 cube名为 rs_nbjc_1_1 的设计如下:
- <!-- rs_nbjc_1_1 用來做MDX FILTER表達式的測試 -->
- <Cube name="rs_nbjc_1_1">
- <Table name="rs_nbjc_1_1" />
- <Dimension name="SEQID" foreignKey="ID" >
- <Hierarchy hasAll="true" primaryKey="ID" allMemberName="SEQID" >
- <Level name="SEQID" column="ID" uniqueMembers="true" type="String" />
- </Hierarchy>
- </Dimension>
- <Dimension name="countdate" foreignKey="ID" >
- <Hierarchy hasAll="true" primaryKey="ID" allMemberName="countdate">
- <Level name="countdate" column="countdate" type='Date' uniqueMembers="false" />
- </Hierarchy>
- </Dimension>
- <Dimension name="SaikuUseDate" foreignKey="ID" >
- <Hierarchy hasAll="true" primaryKey="ID" allMemberName="SaikuUseDate">
- <Level name="SaikuUseDate" column="saikuUseDate" type='Date' uniqueMembers="false" />
- </Hierarchy>
- </Dimension>
- <Measure name="daycount" column="daycount" aggregator="sum" />
- </Cube>
>>>>>>使用SAIKU的MDX表达式过滤
1. 过滤的使用与日常拖拉数据一样,但是记得将需要过滤的字段放入过滤栏位
2. 在过滤这个位置 左击鼠标,然后依次选中 过滤 >>> Custom
3.进入编写MDX过滤表达式弹窗
过滤表达式内容如下:
- Instr(
- IIF(datediff("y",cdate(now()),cdate([countdate].[countdate].CurrentMember.Name))<=7
- AND datediff("y",cdate(now()),cdate([countdate].[countdate].CurrentMember.Name))>=0
- AND year(cdate(now())) - year(cdate([countdate].[countdate].CurrentMember.Name))=0,"yes","no"),"yes")>0
4. 点击ok后,如果取消了自动查询就手动点击一下查询按钮,执行查询后可看到如下结果:(结果数据以及被过滤,取的是近一周的数据,当前日期为 2019-02-28)
ps: 在这里笔者遇到了一个很神奇的问题,在本地部署的Saiku中使用CDate函数没有任何问题,但是部署到服务器上使用CDate函数时,抛出异常:
- #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))
过滤表达式内容如下:
- Instr(
- IIF(datediff("y",cdate(now()),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))
- )<7
- AND datediff("y",cdate(now()),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))
- )>=0
- 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月,则用当前日期减去一个月,取上个月的第一天作为起始日期,然后当前日期作为结束日期,作比较即可(保证年份相同)。
- IIF(
- month(now())-1 = 0
- , (
- datediff('y',dateserial(year(now())-1,12,01) , 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)))<0
- and year(now())-1 - cast(left([countdate].[countdate].CurrentMember.name,4) as Integer) =0
- )
- or
- (
- datediff("y" ,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)),now()) <=0
- and
- year(now()) - cast(left([countdate].[countdate].CurrentMember.name,4) as Integer)=0
- )
- ,
- (
- datediff("y" ,DateSerial(year(now()),month(now())-1,01) ,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))) <= 0
- and
- datediff("y" ,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)), now()) <=0
- and
- year(cdate(now())) - cast(left([countdate].[countdate].CurrentMember.name,4) as Integer)=0
- )
- )
2.过滤周数据:展示本周的所有数据 (注意跨年份的周数据)
展示需求:默认展示最近的周一到目前的所有数据
处理逻辑:
先取出所有数据中与当前日期相同的周的数据
控制取出的数据是本年的或者是上一年12月份的数据
- Datepart('ww',now()) = Datepart('ww',
- DateSerial(cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer),
- cast(mid([saikuUseDate].[saikuUseDate].CurrentMember.name,6,2) as Integer),
- cast(mid([saikuUseDate].[saikuUseDate].CurrentMember.name,9,2) as Integer)))
- and (
- (year(now()) = cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer))
- or
- ((year(now()) - cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer)=1))
- )
- and
- instr(
- IIF(cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer) = (YEAR(now())-1)
- ,(
- iif((datediff('y',DateSerial(cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer),
- cast(mid([saikuUseDate].[saikuUseDate].CurrentMember.name,6,2) as Integer),
- cast(mid([saikuUseDate].[saikuUseDate].CurrentMember.name,9,2) as Integer)),
- Dateserial(year(now())-1,12,01))>0)
- and (cast(left([saikuUseDate].[saikuUseDate].CurrentMember.name,4) as Integer) =(YEAR(now())-1))
- ,"yes","no")
- )
- ,"yes"
- ),"yes")>0
=============更新关于过滤===================终于把过滤问题处理好了============== end
ps: 使用过滤表达式后,记得先取消saiku的自动执行哦,然后将用到的数据信息都拖拽好,过滤信息也编写好,最后在手动点击执行!!!(不然每拖拽一次都要执行一遍,很比较浪费内存哦。)
Saiku关于MDX过滤的使用(九)的更多相关文章
- saiku中文查询(鉴于有人提问:saiku执行mdx,有中文报错)
有人问我saiku的中文查询问题: saiku默认执行英文,很多人,在mysql里录入了中文,使用sql语言查询没有问题. 可是,用saiku的mdx查询,就会报错. 这是因为mysql默认支持中文查 ...
- 服务器抓包命令:tcpdump详解
官网地址:http://www.tcpdump.org/tcpdump_man.html 简介: tcpdump,就是:dump the traffic on a network,根据使用者的定义对网 ...
- Linux常用命令 day day up系列3
一.命令执行的优先级二.Linux目录结构三.cat--查看文件内容四.more--查看文件内容五.less--查看文件内容六.head.tail--查看文件内容七.wc--统计文件内容八.grep- ...
- ApacheCN 计算机视觉译文集 20211110 更新
OpenCV3 和 Qt5 计算机视觉 零.前言 一.OpenCV 和 Qt 简介 二.创建我们的第一个 Qt 和 OpenCV 项目 三.创建一个全面的 Qt + OpenCV 项目 四.Mat和Q ...
- ApacheCN 数据科学译文集 20211109 更新ApacheCN 数据科学译文集 20211109 更新
计算与推断思维 一.数据科学 二.因果和实验 三.Python 编程 四.数据类型 五.表格 六.可视化 七.函数和表格 八.随机性 九.经验分布 十.假设检验 十一.估计 十二.为什么均值重要 十三 ...
- ApacheCN 数据科学译文集 20210313 更新
新增了五个教程: Python 和 Jupyter 机器学习入门 零.前言 一.Jupyter 基础知识 二.数据清理和高级机器学习 三.Web 爬取和交互式可视化 Python 数据科学和机器学习实 ...
- ApacheCN 计算机视觉译文集 20210203 更新
新增了五个教程: OpenCV3 和 Qt5 计算机视觉 零.前言 一.OpenCV 和 Qt 简介 二.创建我们的第一个 Qt 和 OpenCV 项目 三.创建一个全面的 Qt + OpenCV 项 ...
- Saiku更改導出文件的文件名(十九)
Saiku更改導出文件的文件名 Saiku查询完数据之后,可以以excel,pdf,csv等格式将数据导出,这里我们来讲一下怎么更改导出的文件名. 找到对应的导出方法所在的js文件: saiku-se ...
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
随机推荐
- Go 初体验 - channel.2 - 超时机制
channel 虽然很好用,但是我们也要考虑异常情况,比如:超时 go 语言怎么解决这个超时问题呢? 可以利用 select 语句: select 的用法与 switch 语言非常类似,由 selec ...
- VCS
timing check相关的, +notimingcheck命令,可以用在compile时,也可以用在run time的时候, 都是将检查timing的系统函数,都disable掉了, 加在comp ...
- SQL Prompt snippets
SQL Prompt snippets https://github.com/gvohra/sqlpromptsnippets
- 【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 ...
- mysql 事务锁超时时间 innodb_lock_wait_timeout
mysql 事务锁超时时间 innodb_lock_wait_timeout: # 查询全局等待事务锁超时时间 SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait ...
- FAT32文件系统学习(上)
2011-06-02 22:30:48 目的:需要编写SD读图片的底层驱动程序.所以要了解一个SD卡常用文件系统基本概念.累计学习用时2.5小时. 一,FAT32的保留区 1,引导扇区 :引导扇区是F ...
- Oarcle的开始
1.数据库大致分类两种 1.关系型数据库(SQL) Oracle.Mysql(80%).DB2.Microsoft SQL Server.ProsgreSQL.Access.SQLSite 2.非关系 ...
- JavaScript eval
JavaScript eval JavaScript中的eval是Python中eval和exec的合集,既可以编译代码也可以获取返回值. // EvalError 执行字符串中的JavaScrip ...
- TCP之种种连接异常
1. connect出错: (1) 若TCP客户端没有收到syn分节的响应,则返回ETIMEOUT错误:调用connect函数时,内核发送一个syn,若无响应则等待6s后再发送一个,若仍然无响应则等待 ...
- MIME类型解析
MIME(Multipurpose Internet Mail Extensions)多用途网络邮件扩展类型,可被称为Media type或Content type, 它设定某种类型的文件当被浏览器打 ...