【问题标题】:How to determine the no of possible combinations in a table?如何确定表中可能组合的数量?
【发布时间】:2015-02-02 19:39:47
【问题描述】:

我有一个表,其中包含以下 4 个维度列和 1 个度量列Col1Col2Col3Col4、度量

维度列的基数分别为abcd

在我的应用程序中,用户可以在每列中选择任意数量的值,即多选,我需要运行查询来查找该组合的总度量值。

所以理论上最坏情况下可能组合的最大数量是(2^a-1) * (2^b-1) * (2^c-1) * (2*d-1)

现在我想知道我的真实数据集中有多少实际组合是可能的,我认为这会少很多,因为并非所有组合在现实生活中都是可能的。

是否有一些 SQL 查询或任何其他方式(可能使用 C#)从实际数据中确定这个数字?

我的文件为.csv,也在我的 SQL 服务器数据库中。

这是一个例子:对于具有二维列的表

用户、操作、请求


U1、A1、10

U1、A2、5

U2、A3、4

理论上可能的最大组合是: (2^2) * (2^3) = 4 * 8 = 32

但实际上,可能的组合只有 10 个

  1. U1 + A1
  2. U1 + A2
  3. U1 + A1 + A2
  4. U1
  5. A1
  6. A2
  7. A1 + A2
  8. U2 + A3
  9. U2
  10. A3

【问题讨论】:

  • 只是为了确保,如果 A 列中有重复值(例如 A1, A2, A2)选择两个 A2s 与只选择其中一个相同?
  • 是的!一样的。为此,我们可以假设 use 可以选择 A1 或 A2 或两者都选或无。
  • 您可以编辑问题并提供一些示例数据吗?我想确保我理解正确。
  • 在问题中添加了前任
  • @user330612 不是 32 种可能性? U1/A3, U1/A1/A3, U1/A2/A3, U1/A1/A2/A3, U2/A1, U1/U2/A1, A1/A2/A3 ... U1/U2/A1/ A2/A3?将其限制为 10 种可能性的额外限制是什么。

标签: c# sql sql-server ssas


【解决方案1】:

一旦您获得了每列的不同值的数量(称它们为nAnBnCnD),可能的选择总数为2^nA * 2^nB * 2^nC * 2^nD。每列是2^n(而不是2^n - 1),因为每个不同的值都有两种状态(选择或未选择)。你可以把它想象成一个长度为 n 的二进制字符串。

您有多种方法来确定每列的不同值的数量。

  • 您可以查询数据库本身

    SELECT count(sub.colA) FROM (SELECT DISTINCT colA FROM Table) as sub

  • 从 csv 文件中读取数据后,您可以查询程序内存中已有的数据(例如使用 LINQ)

    int nA = docs.GroupBy(x => x.colA).Count();

获得所有数字后,只需取幂并相乘即可。为避免溢出,您可以查看 BigInteger 之类的内容。

【讨论】:

  • 这是我已经提到的理论上可能的组合数。我想确切地知道在我的特定数据集/表中可能有多少种组合,而不是理论上的最大值
  • @user330612 这些值直接来自您的数据集。这是什么理论?请更详细地解释你所说的理论是什么意思。
  • 现在在 Q 中添加了详细信息
猜你喜欢
  • 1970-01-01
  • 2012-06-16
  • 2020-09-08
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多