为了提出这个问题,我试图简化。希望这是可以理解的。
基本上,我有一个包含时间维度,另一个维度和层次维度的事实表。出于问题的目的,我们假设分层维度是邮政编码和状态。另一个维度只是描述性的。我们称之为'客户'让我们假设有50个客户。
我需要找到至少有一个邮政编码的状态集,其中每个客户在时间维度中每天至少有一个事实行。如果邮政编码只有49个客户,我不关心它。如果50个客户中的一个甚至在邮政编码中没有1天的价值,我也不在乎。最后,我还需要知道哪些邮政编码符合选择状态。请注意,并不要求每个邮政编码都有完整的数据集 - 只有至少一个邮政编码。
我不介意在客户端进行多次查询和进行一些处理。这是一个数据集,每天只需生成一次并可以缓存。我甚至没有看到一个特别干净的方法来做多次查询而不是简单的暴力迭代,而且数据集中有很多“邮政编码”(实际上不是邮政编码,而是那里)在层次结构的较低级别中大约有100,000个条目,在顶级级别中有几百个,因此zipcode-> state是一个合理的类比)
答案 0 :(得分:1)
作为第一次迭代,您可以尝试以下方法:
假设
我相信你必须将其分解
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)
获得邮政编码后,应该很容易将其加入州。