Sql 从所有其他维度中都有事实的维度中选择所有值

Sql 从所有其他维度中都有事实的维度中选择所有值,sql,data-warehouse,star-schema,dimension,Sql,Data Warehouse,Star Schema,Dimension,为了问这个问题,我试着简化。希望这是可以理解的 基本上,我有一个具有时间维度、另一维度和层次维度的事实表。出于问题的目的,让我们假设层次维度是邮政编码和州。另一个维度只是描述性的。我们称之为“客户”,假设有50个客户 我需要找到一组状态,其中至少有一个邮政编码,其中每个客户在时间维度中每天至少有一个事实行。如果一个邮政编码只有49个客户,我不在乎。如果50个客户中哪怕有一个在邮政编码中一天都没有价值,我不在乎。最后,我还需要知道哪些邮政编码符合该州的选择条件。请注意,不要求每个邮政编码都有完整的

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

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

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


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

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

假定

  • 客户(所有客户的列表)
  • 邮政编码(所有邮政编码的列表)
  • 天数(所有天数的列表)
  • 事实(事实表)
我相信你必须把它分解

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)

获得邮政编码后,应该可以很容易地将其连接回各州。

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

假定

  • 客户(所有客户的列表)
  • 邮政编码(所有邮政编码的列表)
  • 天数(所有天数的列表)
  • 事实(事实表)
我相信你必须把它分解

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)

获得邮政编码后,您应该可以轻松地将其加入美国。

谢谢。我不知道为什么我在绕着它转的时候会有这么大的困难。谢谢。我不知道为什么我在绕着它转的时候会有这么大的困难。