标签: mdx

用于分析查询的 MDX 与 SQL 的好例子

在进行分析查询时,有人可以向我展示 MDX 优于常规 SQL 的一个很好的例子吗?我想将 MDX 查询与给出相似结果的 SQL 查询进行比较。

维基百科说

虽然可以将其中的一些转换为传统 SQL,但即使对于非常简单的 MDX 表达式,它也经常需要合成笨拙的 SQL 表达式。

但是既没有引用也没有例子。我完全清楚底层数据必须以不同的方式组织,并且 OLAP 将需要每次插入进行更多的处理和存储。(我的建议是从 Oracle RDBMS 迁移到Apache Kylin + Hadoop

上下文:我试图说服我的公司我们应该查询 OLAP 数据库而不是 OLTP 数据库。大多数 SIEM 查询大量使用分组依据、排序和聚合。除了性能提升之外,我认为 OLAP (MDX) 查询比等效的 OLTP SQL 更简洁、更易于读/写。一个具体的例子可以说明这一点,但我不是 SQL 专家,更不用说 MDX ...


如果有帮助,以下是针对过去一周发生的防火墙事件的与 SIEM 相关的 SQL 查询示例:

SELECT   'Seoul Average' AS term, 
         Substr(To_char(idate, 'HH24:MI'), 0, 4) 
                  || '0'        AS event_time , 
         Round(Avg(tot_accept)) AS cnt 
FROM     ( 
                SELECT                     * 
                FROM   st_event_100_#yyyymm-1m# 
                WHERE  idate BETWEEN trunc(sysdate, 'iw')-7 …
Run Code Online (Sandbox Code Playgroud)

olap mdx

12
推荐指数
2
解决办法
2万
查看次数

无论层次如何,对 RANK 的 MDX 查询

我希望向我的 SSAS Cube (SSAS 2012) 添加一个计算,该计算将显示当前成员与该石斑鱼中所有其他成员的相对排名,而无需提前指定石斑鱼

例如,假设我已经有一个Efficiency定义为 $$/hour 的计算。

我还想添加一个Efficiency Rank计算,它会告诉我当前成员在它设置中的相对位置。

我试过的语法是

RANK([Measures].[Efficiency].CurrentMember, [Measures].[Efficiency])
Run Code Online (Sandbox Code Playgroud)

我意识到这是不正确的。

我似乎无法在其他任何地方找到这方面的指南,所以我希望有一些既定的最佳实践或模式,因为这似乎是一个相对常见的业务需求。

ssas sql-server-2012 mdx

10
推荐指数
1
解决办法
1962
查看次数

时间作为衡量标准

是否可以将时间作为多维数据集中的度量?

我们正在尝试按天查看员工的上班时间,并汇总为一段时间内的平均值。即使使用No Aggregation度量类型,我在部署时也遇到错误,说StartTime是一个字符串值。它存储为time(7).

这是可能吗?想要做这件事似乎不是一件疯狂的事情?

我们使用的是 SQL Server 2008 R2 Enterprise。

aggregate ssas sql-server-2008-r2 mdx

6
推荐指数
1
解决办法
837
查看次数

非叶级节点的自定义聚合以避免重复计算

我有一个包含以下列的事实表:

WorkerName 
OrderId
NumberOfPackagesPerOrder
Run Code Online (Sandbox Code Playgroud)

请注意,在此事实表中既不是WorkerName也不OrderId是唯一的。多个用户可以处理单个 OrderId 还要注意,NumberOfPackagesPerOrder仅取决于OrderId,即对于每个OrderId,数量NumberOfPackagesPerOrder将相同。

我正在尝试构建一个多维数据集,以按员工层次结构报告来自此数据的分层报告:

ManagerLevel1           [Total orders completed] [Total Packages Shipped]
    Managerlevel2
        .....
        ManagerLevelN
                  Worker
Run Code Online (Sandbox Code Playgroud)

由于多个工作人员可以按相同的顺序工作,因此我需要避免PackagesPerOrder对经理级别(非叶节点)进行重复计算 。

这该怎么做?我需要什么 MDX 脚本才能正确地SUM NumberOfPackagesPerOrder将它们相加,然后将DISTINCT它们添加到OrderId

注 1 - 雇佣层次结构是递归定义的 - 级别不是静态的。
注意 2 - 非叶节点上的管理器也可能会运送包。

sql-server ssas sql-server-2008-r2 mdx

5
推荐指数
1
解决办法
1043
查看次数

针对分析服务器的 OPENQUERY 中的 8000 个字符限制

我有一个类似的查询

SELECT column1, column2 FROM OPENQUERY(AnalysisServerName, 'MDX QUERY ...').
Run Code Online (Sandbox Code Playgroud)

它位于存储过程中。MDX 查询是动态内置的,查询的长度远远超过 8000 个字符(最多可以达到 400 000 个符号)。

MDX 查询返回大约 200 列,我只需要其中的一些。由于尺寸复杂,我无法减少数量。

因此,我必须将结果写入临时表或直接将SELECT它们作为程序的结果。我决定给SELECT他们。但是,当我尝试使用 省略 8000 个字符的限制时EXEC OPENQUERY(AnalysisServerName, 'MDX QUERY ...') AT AnalysisServerName,我无法SELECT甚至将它们保存到临时表中,因为它发生在存储过程内部并且不允许嵌套(遵循此线程)。

我希望我能做到

SELECT column1, column2 FROM (EXEC OPENQUERY(AnalysisServerName, 'MDX Query') AT AnalysisServerName)
Run Code Online (Sandbox Code Playgroud)

即使我可以直接在分析服务器上执行很长的 MDX 查询

DECLARE @myStatement VARCHAR(MAX)
SET @myStatement = 'OPENQUERY(AnalysisServerName, 'MDX Query')'

EXECUTE (@myStatement) AT AnalysisServerName
Run Code Online (Sandbox Code Playgroud)

我无法对存储过程中的结果做任何事情,因为

DECLARE @myStatement VARCHAR(MAX)
SET @myStatement = 'SELECT column1, column2 FROM OPENQUERY(AnalysisServerName, 'MDX …
Run Code Online (Sandbox Code Playgroud)

sql-server ssas mdx

4
推荐指数
1
解决办法
76
查看次数

需要过滤两个属性相同的维度

我已经混淆了场景,但总体思路仍然适用,所以如果模式看起来迟钝,它可能是在这个例子中......

假设我有一个 Student 维度,其中有两个属性 - Major 和 Minor(主题)。

我希望能够在 SSAS 中创建一个命名集,让我以某种方式被记录为主要和次要主题相同的学生......

维度看起来有点像这样:

Student
  - Major
  - Minor
Run Code Online (Sandbox Code Playgroud)

底层表看起来像这样:

StudentID  |  MajorKey  | MinorKey
1             50          51
2             45          101
3             58          56
4             45          45
Run Code Online (Sandbox Code Playgroud)

所以,实际上,我想要一个像这样的 MDX 表达式:

FILTER (
  [Student].allmembers,
  [Student].[Major] = [Student].[Minor]
)
Run Code Online (Sandbox Code Playgroud)

...但我不太清楚语法。有任何想法吗?

更新:

如果我使用这种语法...

FILTER (
  [Student].allmembers,
  [Student].[Major].Properties("Key") = [Student].[Minor].Properties("Key")
)
Run Code Online (Sandbox Code Playgroud)

然后它出于某种原因减慢了整个多维数据集的速度。每个度量(自然的或计算的)需要几分钟,而不是 1-2 秒的预缓存。

sql-server-2008 ssas mdx

3
推荐指数
1
解决办法
4011
查看次数

MDX 计算成员带度量

我正在尝试将计算成员添加到 MDX 查询,这将为我的数据库中的人创建一组“年龄带”。我有一个包含每个人年龄的度量。

我已经开始使用这个 MDX

SELECT 
  NON EMPTY {[Measures].[Count of People]} ON COLUMNS,
  NON EMPTY {
    (
        [People].[Gender].[Gender],
        [People].[Some].[Other Attributes]
    )
  } ON ROWS
FROM [MyCube]
WHERE ( ... slicer here .... )
Run Code Online (Sandbox Code Playgroud)

我还有另一个措施([Measures].[Age] ),我想将其捆绑起来并与行一起返回,例如 0-25、26-50 岁等的任何人

这是我试过的

WITH SET [Age Band]
    AS IIF([Measures].[Age]<26,"0-26",IIF([Measures].[Age]<51,"26-51","Over 50"))
SELECT 
  NON EMPTY {[Measures].[Count of People]} ON COLUMNS,
  NON EMPTY {
    (
        [People].[Gender].[Gender],
        [People].[Some].[Other Attributes],
        [Age Band]
    )
  } ON ROWS
FROM [MyCube]
WHERE ( ... slicer here .... )
Run Code Online (Sandbox Code Playgroud)

但是我得到的错误是

该函数需要参数的元组集表达式。使用了字符串或数字表达式。

我究竟做错了什么?有没有更简单/更好的方法来做到这一点而无需链接IIF …

ssas mdx

3
推荐指数
1
解决办法
4758
查看次数

MDX - 动态获取过去 6 个月

我有一个 Dim 表,名为DimAccounts. 它描述了一个用户帐户和该帐户的创建日期。例如:

在此处输入图片说明

我想动态获取过去 6 个月内创建的帐户列表。例如今天是 09\01\2016。所以我的帐户列表将是从01-08-2015直到创建的帐户09-01-2016。请注意,此CreatedOn字段没有层次结构,它是帐户维度的一个属性。

sql-server ssas mdx dimension

3
推荐指数
1
解决办法
4643
查看次数

如何计算维度属性的百分比并获得正确的聚合?

我们有一个事实表,其中包含卡车/司机/天运输的重量。

以及每辆卡车最大重量的尺寸。

我们希望运输重量的百分比,所以我们从

create MEMBER CURRENTCUBE.[Measures].[% WT]
 AS [Measures].[Weight]/[Dim Truck].[Max_weight].currentmember.properties("key"), 
FORMAT_STRING = "Percent";
Run Code Online (Sandbox Code Playgroud)

这仅适用于一辆卡车在特定日期和司机只有一片叶子的个别行。

如果卡车一天行驶两次,而不是 sum(weight)/sum(max_weight) 或者如果您更喜欢 sum(weight)/(n*max_weight) 我们得到的是 sum(weight)/max_weight,则它不起作用

在任何聚合级别都会发生完全相同的情况。例如,月或年或总计。或者只是在卡车级别。

我们一直在玩各种公式和范围,但没有成功。

知道如何定义它以便聚合按预期工作吗?

ssas mdx dimension

3
推荐指数
1
解决办法
769
查看次数

与 UNION 和 DESCENDANTS 结合使用的 Analysis Service 中 Measures 的错误聚合

更新:当我试图提供一个简单的例子来重现这个问题时,我在我的数据库中发现了引入这个问题的调平器。因此,我对这个问题进行了更新,以反映这一新发现。您将在下面找到用于设置重现此问题的数据库的脚本。

我在服务器版本 2008 和 2012 中遇到了 Analysis Services 的奇怪行为。

在我的 AS 数据库中,我定义了一个带有基本度量的多维数据集,如下所示:

AggregateFunction: Min;
Name: Existing Data
Run Code Online (Sandbox Code Playgroud)

如您所见,聚合函数是Min

包含相应existing_data列的事实表仅包含01值。目标是在数据选择包含链接到零值的类别时立即返回零。该矩阵表示存储在另一个事实表中的真实事实中已经/尚未为其收集数据的区域,因此我们可以区分结果是否为零,因为在所选区域中没有任何案例,或者因为在所选区域中尚未收集到任何病例的地区。

当我现在运行以下查询时,我为每个选定的类别获得 1:

WITH
   SET [adhoc] AS 'UNION(
     DESCENDANTS([Gebiete].[Hierarchie].[Bezirk].[010],[Gebiete].[Hierarchie].[Landkreis]),
     DESCENDANTS([Gebiete].[Hierarchie].[Bundesland].[10],[Gebiete].[Hierarchie].[Landkreis])
   )'
SELECT [adhoc] ON 0
FROM [Testdb]
WHERE ([Measures].[Existing Data])
Run Code Online (Sandbox Code Playgroud)

结果

01001    01002    10041    10042
1        1        1        1
Run Code Online (Sandbox Code Playgroud)

当我现在将此查询更改为以下内容时,我希望一个包含 1 的单元格作为结果,因为该Min()函数聚合的所有值都是 1(与之前的结果相比):

WITH
    SET [adhoc] AS 'UNION(
      DESCENDANTS([Gebiete].[Hierarchie].[Bezirk].[010],[Gebiete].[Hierarchie].[Landkreis]),
      DESCENDANTS([Gebiete].[Hierarchie].[Bundesland].[10],[Gebiete].[Hierarchie].[Landkreis])
    )'
    MEMBER [Gebiete].[Hierarchie].[adhoc] AS 'Aggregate([adhoc])'
SELECT {[Gebiete].[Hierarchie].[adhoc]} ON 0
FROM [Testdb] …
Run Code Online (Sandbox Code Playgroud)

ssas mdx

2
推荐指数
1
解决办法
2217
查看次数

T-SQL 和 MDX 之间最相关的相似之处是什么?

我使用过 T-SQL(CTE、窗口函数、递归 CTE、大数据、表值函数、APPLY、PIVOT、存储过程等),但从未查询过 Microsoft SSAS 多维数据集。

对于以下 T-SQL 概念,MDX 中是否有类似的概念?

  • 转轴
  • 窗口函数
  • 递归公用表表达式

使用 MDX 的 T-SQL 用户是否有任何陷阱?

我希望 T-SQL 和 MDX 之间有一些共同的类比,这将有助于擅长 T-SQL 的人过渡到 MDX。

如果有一个关于从 T-SQL 进入 MDX 时所犯的常见错误的指南,那就太好了。

sql-server learning ssas t-sql mdx

2
推荐指数
1
解决办法
208
查看次数