Подсчет разных IP-адресов в каждой стране

У меня есть куб с информацией о посещениях веб-сайта с IP-адресами и страной.

Я хотел бы получить количество уникальных IP-адресов для каждой страны, как показано в следующей таблице.

+-------------+----------+
| country     | count IP |
+-------------+----------+
| germany     | 2        |
| netherlands | 3        |
+-------------+----------+

Но все, что я придумал, так это:

+-------------+---------------+--------+
| country     | IP            | visits |
+-------------+---------------+--------+
| germany     | 65.49.14.152  | 5      |
|             | 66.55.144.187 | 12     |
| netherlands | 93.114.46.11  | 2      |
|             | 93.115.94.85  | 5      |
|             | 141.105.1.7   | 1      |
+-------------+---------------+--------+

который производится по этому запросу:

SELECT 
  NON EMPTY 
    {Hierarchize({[Measures].[Visits]})} ON COLUMNS
 ,NON EMPTY 
    CrossJoin
    (
      [Geografy.Localizacion].[Country].MEMBERS
     ,[RemoteClient].[IP].MEMBERS
    ) ON ROWS
FROM [VisitsCube];

Как я могу изменить этот запрос для получения результатов, как в первой таблице?

2 ответа

Решение

Создайте вычисляемый член, который будет хранить количество уникальных IP-адресов. А с оси ряда убери [RemoteClient].[IP].Members,

WITH MEMBER Measures.[Count IP] AS
SUM(Distinct(EXISTING [RemoteClient].[IP].Members), [Measures].[Visits])

SELECT NON EMPTY [Geografy.Localizacion].[Country].Members ON 1,
NON EMPTY Measures.[Count IP] ON 0
FROM [VisitsCube]

В AdvWrks Я проверил этот метод:

WITH 
  MEMBER [Measures].[CountX] AS 
    Sum
    (
      [Customer].[Customer Geography].[City]
     ,IIF
      (
       NOT isempty([Measures].[Internet Sales Amount])
       ,1
       ,null
      )
    ) 
SELECT 
  {[Measures].[CountX]} ON 0
 ,NON EMPTY 
      [Product].[Product Categories].[Category]
 ON 1
FROM [Adventure Works]
WHERE 
  [Geography].[Geography].[Country].&[Canada];

Он дает подсчет количества городов, в которых были интернет-продажи Amoutn для каждой категории продуктов:

введите описание изображения здесь

Применительно к вашей ситуации я думаю, что это так:

WITH 
  MEMBER [Measures].[CountX] AS 
    Sum
    (
      [RemoteClient].[IP].MEMBERS
     ,IIF
      (
       NOT isempty([Measures].[Visits])
       ,1
       ,null
      )
    ) 
SELECT 
  NON EMPTY 
    [Geografy.Localizacion].[Country].MEMBERS ON 1
 ,NON EMPTY 
    [Measures].[CountX] ON 0
FROM [VisitsCube];
Другие вопросы по тегам