MDX :基于度量的维度的前十名
MDX : Top ten of a dimension based on measure
这是我的 OLAP 多维数据集架构
<?xml version="1.0"?>
<Schema name="mySchema">
<Cube name="myCube">
<Table name="fact_access_logs_views"/>
<Dimension name="Countries" foreignKey="country_code_id">
<Hierarchy hasAll="true" primaryKey="country_code_id">
<Table name="dim_country_code"/>
<Level name="CountryCodes" column="CountryCode" uniqueMembers="false"/>
</Hierarchy>
</Dimension>
<Dimension name="Channels" foreignKey="channel_id">
<Hierarchy hasAll="true" primaryKey="channel_id">
<Table name="dim_channel"/>
<Level name="Channels" column="shortname_chn" uniqueMembers="false"/>
</Hierarchy>
</Dimension>
<Dimension name="Time" foreignKey="access_time_id">
<Hierarchy hasAll="true" primaryKey="access_time_id">
<Table name="dim_time_access"/>
<Level name="Year" column="Year" uniqueMembers="false"/>
<Level name="Month" column="Month" uniqueMembers="false"/>
<Level name="Date" column="Date" uniqueMembers="false"/>
<Level name="Hour" column="Hour" uniqueMembers="false"/>
</Hierarchy>
</Dimension>
<Measure name="View Count" column="id" aggregator="count" formatString="#,###"/>
</Cube>
</Schema>
我想做的是根据观看次数找出排名前十的国家,并进一步在每个国家内找出排名前十的频道。请帮助我构造一个 MDX 查询。我试着按照这个 https://msdn.microsoft.com/en-us/library/ms145579
但最终在查看立方体时出现错误。
使用 TopCount 和 Generate,您可以这样做。
TopCount 将为您提供按您选择的度量排序的顶级成员。
观看次数排名前 10 位的国家/地区:
TopCount([Countries].[CountryCode].[CountryCode],10 ,[Measures].[View Count] )
然后您将使用 generate 和 currentmember 迭代第一组热门国家/地区
并使用上面相同的逻辑获取热门频道,但对于频道。
WITH
SET TOPCHANNELSperTOPCOUNTRY AS
Generate
(
TopCount
(
[Countries].[CountryCode].[CountryCode]
,10
,[Measures].[View Count]
)
,TopCount
(
(
[Countries].[CountryCode].CurrentMember
,[Channels].[Channels].[Channels]
)
,10
,[Measures].[View Count]
)
)
SELECT
[Measures].[View Count] ON 0
,TOPCHANNELSperTOPCOUNTRY ON 1
FROM [myCube];
(抱歉,如果某些维度名称或成员不正确)...
您可以使用 Top Count、Generate 和 CrossJoin 实现此目的。
WITH
SET TEMP AS
'Generate(TopCount([Countries].[CountryCodes].Members,
10,
[Measures].[View Count]),
Crossjoin(
{[CountryCodes].CurrentMember},
TopCount(
[Channels].[Channels].Members,
10, [Measures].[View Count])
)
)'
select {[Measures].[View Count]} ON COLUMNS,
[TEMP] ON ROWS
from [myCube]
这是我的 OLAP 多维数据集架构
<?xml version="1.0"?>
<Schema name="mySchema">
<Cube name="myCube">
<Table name="fact_access_logs_views"/>
<Dimension name="Countries" foreignKey="country_code_id">
<Hierarchy hasAll="true" primaryKey="country_code_id">
<Table name="dim_country_code"/>
<Level name="CountryCodes" column="CountryCode" uniqueMembers="false"/>
</Hierarchy>
</Dimension>
<Dimension name="Channels" foreignKey="channel_id">
<Hierarchy hasAll="true" primaryKey="channel_id">
<Table name="dim_channel"/>
<Level name="Channels" column="shortname_chn" uniqueMembers="false"/>
</Hierarchy>
</Dimension>
<Dimension name="Time" foreignKey="access_time_id">
<Hierarchy hasAll="true" primaryKey="access_time_id">
<Table name="dim_time_access"/>
<Level name="Year" column="Year" uniqueMembers="false"/>
<Level name="Month" column="Month" uniqueMembers="false"/>
<Level name="Date" column="Date" uniqueMembers="false"/>
<Level name="Hour" column="Hour" uniqueMembers="false"/>
</Hierarchy>
</Dimension>
<Measure name="View Count" column="id" aggregator="count" formatString="#,###"/>
</Cube>
</Schema>
我想做的是根据观看次数找出排名前十的国家,并进一步在每个国家内找出排名前十的频道。请帮助我构造一个 MDX 查询。我试着按照这个 https://msdn.microsoft.com/en-us/library/ms145579 但最终在查看立方体时出现错误。
使用 TopCount 和 Generate,您可以这样做。
TopCount 将为您提供按您选择的度量排序的顶级成员。
观看次数排名前 10 位的国家/地区:
TopCount([Countries].[CountryCode].[CountryCode],10 ,[Measures].[View Count] )
然后您将使用 generate 和 currentmember 迭代第一组热门国家/地区 并使用上面相同的逻辑获取热门频道,但对于频道。
WITH
SET TOPCHANNELSperTOPCOUNTRY AS
Generate
(
TopCount
(
[Countries].[CountryCode].[CountryCode]
,10
,[Measures].[View Count]
)
,TopCount
(
(
[Countries].[CountryCode].CurrentMember
,[Channels].[Channels].[Channels]
)
,10
,[Measures].[View Count]
)
)
SELECT
[Measures].[View Count] ON 0
,TOPCHANNELSperTOPCOUNTRY ON 1
FROM [myCube];
(抱歉,如果某些维度名称或成员不正确)...
您可以使用 Top Count、Generate 和 CrossJoin 实现此目的。
WITH
SET TEMP AS
'Generate(TopCount([Countries].[CountryCodes].Members,
10,
[Measures].[View Count]),
Crossjoin(
{[CountryCodes].CurrentMember},
TopCount(
[Channels].[Channels].Members,
10, [Measures].[View Count])
)
)'
select {[Measures].[View Count]} ON COLUMNS,
[TEMP] ON ROWS
from [myCube]