在进行分析查询时,有人可以向我展示 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) 我希望向我的 SSAS Cube (SSAS 2012) 添加一个计算,该计算将显示当前成员与该石斑鱼中所有其他成员的相对排名,而无需提前指定石斑鱼。
例如,假设我已经有一个Efficiency定义为 $$/hour 的计算。
我还想添加一个Efficiency Rank计算,它会告诉我当前成员在它设置中的相对位置。
我试过的语法是
RANK([Measures].[Efficiency].CurrentMember, [Measures].[Efficiency])
Run Code Online (Sandbox Code Playgroud)
我意识到这是不正确的。
我似乎无法在其他任何地方找到这方面的指南,所以我希望有一些既定的最佳实践或模式,因为这似乎是一个相对常见的业务需求。
是否可以将时间作为多维数据集中的度量?
我们正在尝试按天查看员工的上班时间,并汇总为一段时间内的平均值。即使使用No Aggregation度量类型,我在部署时也遇到错误,说StartTime是一个字符串值。它存储为time(7).
这是可能吗?想要做这件事似乎不是一件疯狂的事情?
我们使用的是 SQL Server 2008 R2 Enterprise。
我有一个包含以下列的事实表:
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 - 非叶节点上的管理器也可能会运送包。
我有一个类似的查询
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) 我已经混淆了场景,但总体思路仍然适用,所以如果模式看起来迟钝,它可能是在这个例子中......
假设我有一个 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 秒的预缓存。
我正在尝试将计算成员添加到 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 …
我有一个 Dim 表,名为DimAccounts. 它描述了一个用户帐户和该帐户的创建日期。例如:
我想动态获取过去 6 个月内创建的帐户列表。例如今天是 09\01\2016。所以我的帐户列表将是从01-08-2015直到创建的帐户09-01-2016。请注意,此CreatedOn字段没有层次结构,它是帐户维度的一个属性。
我们有一个事实表,其中包含卡车/司机/天运输的重量。
以及每辆卡车最大重量的尺寸。
我们希望运输重量的百分比,所以我们从
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,则它不起作用
在任何聚合级别都会发生完全相同的情况。例如,月或年或总计。或者只是在卡车级别。
我们一直在玩各种公式和范围,但没有成功。
知道如何定义它以便聚合按预期工作吗?
更新:当我试图提供一个简单的例子来重现这个问题时,我在我的数据库中发现了引入这个问题的调平器。因此,我对这个问题进行了更新,以反映这一新发现。您将在下面找到用于设置重现此问题的数据库的脚本。
我在服务器版本 2008 和 2012 中遇到了 Analysis Services 的奇怪行为。
在我的 AS 数据库中,我定义了一个带有基本度量的多维数据集,如下所示:
AggregateFunction: Min;
Name: Existing Data
Run Code Online (Sandbox Code Playgroud)
如您所见,聚合函数是Min。
包含相应existing_data列的事实表仅包含0或1值。目标是在数据选择包含链接到零值的类别时立即返回零。该矩阵表示存储在另一个事实表中的真实事实中已经/尚未为其收集数据的区域,因此我们可以区分结果是否为零,因为在所选区域中没有任何案例,或者因为在所选区域中尚未收集到任何病例的地区。
当我现在运行以下查询时,我为每个选定的类别获得 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) 我使用过 T-SQL(CTE、窗口函数、递归 CTE、大数据、表值函数、APPLY、PIVOT、存储过程等),但从未查询过 Microsoft SSAS 多维数据集。
对于以下 T-SQL 概念,MDX 中是否有类似的概念?
使用 MDX 的 T-SQL 用户是否有任何陷阱?
我希望 T-SQL 和 MDX 之间有一些共同的类比,这将有助于擅长 T-SQL 的人过渡到 MDX。
如果有一个关于从 T-SQL 进入 MDX 时所犯的常见错误的指南,那就太好了。