2

我正在为我的仓库设计一个新的客户事实和维度。在我寻找好的示例模型时,我发现了一些奇怪的东西。似乎没有人有以客户为中心的事实。我发现的每个示例都有一个交易事件,例如销售或订单作为中心事实,以客户为维度。这对我提出了一个问题。

我是否因为想要客户事实而做错了什么?目标是能够分析客户行为,例如订单频率、总支出、购置成本、独特性、产品数量等。这些问题对我来说自然意味着一个事实,而不是一个维度。我已经有一个订单事实,它非常适合以订单为中心的查询,但不适用于以客户为中心的查询。

为您提供更多细节,客户事实可能具有以下度量和维度:

措施:

  • 客户数
  • 不同的产品数量
  • 已完成订单计数
  • 总收入
  • 总消耗
  • 收到的优惠券数量
  • 兑换的优惠券数量
  • 兑换优惠券的费用

方面:

  • 订单交货日期
  • 订单交货时间
  • 订单交付地理
  • 采集源
  • 订单类型
  • 优惠券类型

以上对我来说似乎很自然,但我担心我在这个新立方体中采用以客户为中心的方法会错过一个明显的禁忌。

4

4 回答 4

4

我们有客户资料。很多时候,它们是无事实的事实表,只是链接了几个维度。

听起来你的很多事实都是衍生或总结的。谷物仍然很重要。如果您说订单计数是 MTD(以及什么日期)或所有时间等。

我不认为这有什么问题,但我认为因为这是派生数据,大多数人会将其放入“数据集市”或任何用于分析的子集的最佳明确术语。

我同意以相同的方式对其进行建模是完全有效的。您唯一需要注意的是所有派生数据都相同,它需要保持一致。

您的客户将有一个维度(一致,因为它在模型之间共享),然后是一个 CustomerStats 事实表或其他任何东西,每个事实都在共享所有这些维度的粒度上。

于 2010-07-16T19:01:02.360 回答
1

如此多的系统是以订单为中心而不是以客户为中心的原因在于,您识别客户的方式会随着时间的推移而发生如此频繁的变化:以前将企业视为客户演变为将单个员工视为客户,反之亦然,或者客户将更改/拆分/合并地址,或者企业更改名称,我们想要合并(或分离)新旧绩效总计,或者现在必须扩展送货地址和账单地址以包含支持地址,或者运营商忘记或将一个地址误用为另一个,或者客户只想暂时使用特殊的送货地址,等等。

此处将对此进行更详细的说明。

于 2010-07-16T19:30:08.697 回答
0

我可能误解了您的问题,但让我们看看可以从factOrder only(老式的方式)中了解哪些客户行为。

假设 factOrder 的粒度是订单上的一行,并且OrderID作为退化维度。

-- Number of customers who ordered something at least once
select
    count(distinct CustomerKey) as PayingCustomers
from factOrder ;

.

-- Number of orders and sales per customer
select 
      CustomerKey
    , count(distinct OrderID) as NumberOfOrders
    , sum(ExtendedPrice)      as Total
from factOrder
group by CustomerKey ;

.

-- Histogram (x = NumberOfOrders, y = People, Amount)
with
orders_per_customer as (
    select 
      CustomerKey
    , count(distinct OrderID) as cnt
    , sum(ExtendedPrice)      as Total
    from factOrder
    group by CustomerKey
)
select
      cnt        as NumberOfOrders
    , count(1)   as People
    , sum(Total) as Amount
from orders_per_customer
group by cnt
order by cnt asc ;

.

-- Distinct products ordered by customer
select 
      CustomerKey
    , count(distinct ProductKey) as DistinctProductsOrdered
from factOrder
group by CustomerKey ;

.

-- Histogram (x = NumberOfDistinctProducts, y = People)
with
products_per_customer as (
    select 
      CustomerKey
    , count(distinct ProductKey)  as cnt
    from factOrder
    group by CustomerKey
)
select
      cnt       as NumberOfDistinctProducts
    , count(1)  as People
from products_per_customer
group by cnt
order by cnt asc ;
于 2010-07-16T18:43:16.347 回答
0

order frequencytotal spendacquisition costdistinct product count等度量实际上是作为事实表派生Orders的,客户作为维度。按客户汇总可以很容易地按产品或按地理位置汇总。

正如 Cade Roux 所建议的,您可以构建一个客户聚合表,该表应该与其他事实表分离,但这纯粹是一个性能决定。Customers通过构造为 的维度,您可以保持最大的灵活性Orders

于 2010-07-20T15:58:14.143 回答