1

为了提出这个问题,我试图简化。希望这将是可以理解的。

基本上,我有一个具有时间维度、另一个维度和层次维度的事实表。出于问题的目的,我们假设分层维度是邮政编码和州。另一个维度只是描述性的。我们称它为“客户” 假设有 50 个客户。

我需要找到一组状态,其中至少有一个邮政编码,其中每个客户在时间维度上每天至少有一个事实行。如果一个邮政编码只有 49 个客户,我不在乎。如果 50 个客户中的一个在邮政编码中甚至 1 天都没有价值,我不在乎。最后,我还需要知道哪些邮政编码符合该州的选择条件。请注意,并不要求每个邮政编码都具有完整的数据集 - 只需至少一个邮政编码即可。

我不介意进行多个查询并在客户端进行一些处理。这是一个每天只需要生成一次并且可以缓存的数据集。我什至没有看到一种特别干净的方法来处理多个查询,而不是简单的蛮力迭代,并且数据集中有很多“邮政编码”(实际上不是邮政编码,但是那里在层次结构的较低级别大约有 100,000 个条目,而在顶层有数百个条目,因此 zipcode->state 是一个合理的类比)

4

1 回答 1

1

作为第一次迭代,您可以尝试以下操作:

假设

  • 客户(所有客户的列表)
  • zip_codes(所有邮政编码的列表)
  • 天(所有天的列表)
  • 事实(事实表)

我相信你必须打破它

1)获取每天都有事实的客户和邮政编码

SELECT zip_id, customer_id, COUNT(DISTINCT days)
FROM facts
GROUP BY zip_id, customer_id
HAVING COUNT(DISTINCT days) = (SELECT COUNT(*) FROM days) 

2)从此结果集中检查具有所有客户的拉链

SELECT zip_id, COUNT(DISTINCT customer_id)
FROM ( 
    SELECT zip_id, customer_id, COUNT(DISTINCT days)
    FROM facts
    GROUP BY zip_id, customer_id
    HAVING COUNT(DISTINCT days) = (SELECT COUNT(*) FROM days) 
    ) S
GROUP BY zip_id
HAVING COUNT(DISTINCT customer_id) = (SELECT COUNT(*) FROM customers)

获得邮政编码后,应该很容易将其加入各州。

于 2010-04-06T18:38:25.750 回答