在特定时间获取不同的用户计数 MDX QUERY

Posted

技术标签:

【中文标题】在特定时间获取不同的用户计数 MDX QUERY【英文标题】:Get Distinct User Count Over Particular Time MDX QUERY 【发布时间】:2021-02-20 05:14:12 【问题描述】:

我需要一些 mdx 帮助。

立方体详情:

Measures.Users -> 对用户的不同计数。

我想找到这个查询的 mdx 等效项:

Select a.shopId ,   Month(TransactionDate) Month_Transaction, 
Year(TransactionDate) Year_Transaction,
count(distinct b.UserID) UniqueUserCount

FROM [dbo].[shop] a
JOIN users b ON a.UserID = b.UserID
where TransactionDate >= '2018-01-01' 
Group by  a.shopId ,Month(TransactionDate), Year(TransactionDate)

这是我迄今为止所拥有的,无论日期如何,它都会产生唯一计数。我想要日期范围内的唯一计数。请让我知道如何实现这一目标?

SELECT  
[Date].[Month].&[2020]&[2020-Q3]&[2020-09],
[Date].[Month].&[2020]&[2020-Q4]&[2020-10],
[Date].[Month].&[2020]&[2020-Q4]&[2020-11], 
[Date].[Month].&[2020]&[2020-Q4]&[2020-12]
 ON COLUMNS, NON EMPTY 
 
    [ShopLocations].[Hierarchy].[Shop] 
 ON ROWS 

FROM [ShopperCube] 
where (Measures.Users)

【问题讨论】:

内置的不同计数度量提供了最大的灵活性。听起来您已经有一个 Measure.Users 了?用户的度量组是否与您的日期和商店位置维度相关联? 有没有办法使用计算列来做到这一点?我认为用户度量组未连接到日期。 应该是可以连接的。我将在多对多革命论文中应用 Distinct Count 模式,以获得更灵活且运行速度更快的无代码解决方案:sqlbi.com/whitepapers/many2many @MikeHoney 您最初的评论帮助我解决了问题。谢谢。 不用担心 - 转发为答案,因为我的多巴胺命中。 【参考方案1】:

内置的非重复计数度量提供了最大的灵活性。听起来您已经有一个 Measure.Users 了?用户的度量组是否连接到您的 Date 和 ShopLocations 维度?

为了帮助实现这一点,我将回顾多对多革命论文中的不同计数模式。这种方法提供了一种更灵活且运行速度可能更快的无代码解决方案:

https://sqlbi.com/whitepapers/many2many

【讨论】:

【参考方案2】:

您可以使用DistinctCount MDX 函数。

官方文档不是很清楚,但是,一般原则是:您将“Set”传递给此函数以获取不同的值。

一个示例 MDX

WITH SET MySet AS
     [Dim User].[User Id].Children  
 
MEMBER Measures.SetDistinctCount AS
    DISTINCTCOUNT(MySet)

SELECT  Measures.SetDistinctCount, Measures.Amount   ON 0
       ,  [Dim Date].[Date Key].AllMembers  ON 1
FROM [Mine]

为了验证这一点,以下是我的设置:

查询结果

另外,给出创建表和处理不同数据的示例 sql:

IF OBJECT_ID('FactTransaction') IS NOT NULL
    DROP TABLE FactTransaction
GO

CREATE TABLE FactTransaction (ShopId INT, TransactionDateKey INT, UserId INT, Amount INT)
GO

IF OBJECT_ID('DimDate') IS NOT NULL
    DROP TABLE DimDate
GO
CREATE TABLE DimDate(DateKey INT, FullDate DATE)
GO

IF OBJECT_ID('DimUser') IS NOT NULL
    DROP TABLE DimUser
GO
CREATE TABLE DimUser(UserId INT, UserName VARCHAR(50))
GO

IF OBJECT_ID('DimShop') IS NOT NULL
    DROP TABLE DimShop
GO
CREATE TABLE DimShop(ShopId INT, ShopName VARCHAR(50))
GO

--Shop 1
INSERT INTO FactTransaction values(1, 20210101, 1, 10)
INSERT INTO FactTransaction values(1, 20210101, 2, 5)
INSERT INTO FactTransaction values(1, 20210101, 3, 20)

INSERT INTO FactTransaction values(1, 20210102, 2, 10)
INSERT INTO FactTransaction values(1, 20210102, 4, 15)

INSERT INTO FactTransaction values(1, 20210103, 3, 5)
INSERT INTO FactTransaction values(1, 20210103, 4, 10)
INSERT INTO FactTransaction values(1, 20210103, 5, 20)
INSERT INTO FactTransaction values(1, 20210103, 1, 20)


--Shop 2
INSERT INTO FactTransaction values(2, 20210103, 2, 10)
INSERT INTO FactTransaction values(2, 20210103, 2, 5)
INSERT INTO FactTransaction values(2, 20210103, 2, 20)
GO

INSERT INTO DimDate VALUES(20210101, '2021-01-01')
INSERT INTO DimDate VALUES(20210102, '2021-01-02')
INSERT INTO DimDate VALUES(20210103, '2021-01-03')
GO

INSERT INTO DimUser VALUES(1, 'First')
INSERT INTO DimUser VALUES(2, 'Second')
INSERT INTO DimUser VALUES(3, 'Third')
INSERT INTO DimUser VALUES(4, 'Fourth')
INSERT INTO DimUser VALUES(5, 'Fifth')

GO

INSERT INTO DimShop VALUES(1, 'Shop 1')
INSERT INTO DimShop VALUES(2, 'Shop 2')
GO

【讨论】:

以上是关于在特定时间获取不同的用户计数 MDX QUERY的主要内容,如果未能解决你的问题,请参考以下文章

Google Big Query 按页面路径和 Google Analytics 数据的自定义维度获取用户计数

MDX 计算的测量计数

使用 MDX 查询从日期范围中获取特定日期的时间表

Django Query 获取 ArrayField 列的所有不同值的计数

7 天用户计数:Big-Query 自加入以获取日期范围和计数?

如何在 mdx 查询上应用分组依据