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过滤的使用(九)的更多相关文章

  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. day01 格式化输出和while循环的两个小练习

    练习1.模拟登陆判断(3次机会) r_name = 'xianyu' r_password = ' i = 3 # 用来控制循环次数 while i > 0: name = input('请输入 ...

  2. solr简单搜索案例

    solr简单搜索案例 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字搜索商品信息,根据商品分类.价格过滤搜索结果,也可以根据价格进行排序,实现分页. 架构分为: 1. solr服务器 2. ...

  3. Python手势识别

    这是借鉴了github上的一个源程序,参考源:https://github.com/lzane/Fingers-Detection-using-OpenCV-and-Python 自己在这个基础上做了 ...

  4. CMD控制器常用命令

    dir 查看当前路径文件cd..返回上一级路径cd 转到指定的文件夹 \n 将光标移动到下一行的第一格 \t 将光标移动到下一个水平制表位置 mspaint 画图 编译源代码 javac HelloW ...

  5. Spring Boot 数据库连接池 Druid

    简介 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问 ...

  6. 在myeclipse中使用log4j记录日志

    1.从官方网站下载 jakarta-log4j-1.2.17.tar.gz http://logging.apache.org/log4j/1.2/download.html 2.在eclipse中将 ...

  7. Learning-MySQL【6】:视图、触发器、存储过程、函数、流程控制

    一.视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可.使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的 SQL 语句了 ...

  8. Mock.js 虚拟接口 数据模拟

    Mock.js 是一款前端开发中拦截Ajax请求再生成随机数据响应的工具.可以用来模拟服务器响应. 优点是非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型. 大概记录下使用过程, 详细使用可以参 ...

  9. [福建集训2011][LOJ10111]相框

    这题主要还是分类讨论欧拉回路 首先对于导线一端没有东西的新建一个节点 由于原图不一定连通所以需要用到并查集判断有多少个连通块 将一条导线连接的两个焊点连接 然后先对于只有一个连通块考虑 1.如果一个焊 ...

  10. mysql数据库连接出问题,提示超时 java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.解决办法

    mysql数据库连接出问题,提示超时,后来发现问题在于连接mysql数据库的jar包跟数据库版本不对应导致的,更换jar包一致就解决了.