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]