代码之家  ›  专栏  ›  技术社区  ›  ideasculptor

从一个维度中选择所有值,该维度在所有其他维度中都有事实

  •  1
  • ideasculptor  · 技术社区  · 14 年前

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

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

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

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

    1 回复  |  直到 14 年前
        1
  •  1
  •   Unreason    14 年前

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

    假设

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

    我相信你必须把它分解

    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)
    

    在你得到邮政编码后,它应该很容易加入它回到美国。