2015-02-02 2 views
0

У меня есть таблица, которая имеет следующие 4 колонки измерений и столбцов Col1, Col2, Col3, Col4 1 мера, мераКак определить отсутствие возможных комбинаций в таблице?

Мощность колонок размерности a, b, c, d соответственно.

В моем приложении пользователь может выбрать любое количество значений в каждом столбце, т. Е. Множественный выбор, и мне нужно запустить запрос, чтобы найти общее количество мер для этого комбо.

Так теоретически максимальное число возможных комбинаций (2^a-1) * (2^b-1) * (2^c-1) * (2*d-1) в худшем случае.

Теперь я хочу знать, сколько фактических комбинаций возможно из моего реального набора данных, который, как я полагаю, будет намного меньше, потому что не все комбинации возможны в реальной жизни.

Есть ли какой-либо SQL-запрос или каким-либо другим способом (с использованием C# может быть), чтобы определить этот номер из фактических данных?

У меня есть файл .csv, а также в моей базе данных SQL-сервера.

Вот пример: для таблицы с 2-размерных столбцов

пользователя, действие, просит


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
+0

Просто убедитесь, что, если в столбце A есть повторяющиеся значения (например, 'A1, A2, A2'), вы выбираете оба' A2 'так же, как выбрать только один из них? – ryanyuyu

+0

да! это то же самое. Для этого можно предположить, что использование может выбрать либо A1, либо A2, либо оба, либо none. – user330612

+0

Можете ли вы отредактировать вопрос и предоставить некоторые данные образца? Я хочу быть уверенным, что правильно понимаю. –

ответ

0

После того, как у вас есть число различных значений для каждого столбца, (назовем их nA, nB, nC, nD), общее число возможных выборов является 2^nA * 2^nB * 2^nC * 2^nD. Это 2^n за столбец (а не 2^n - 1), потому что каждое отдельное значение имеет 2 состояния (выбрано или не выбрано). Вы можете думать об этом как двоичная строка длины n.

У вас есть множество способов определить количество различных значений для каждого столбца.

  • Вы можете запросить саму базу данных

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

  • Вы можете запросить данные у вас уже есть в памяти программы (с помощью LINQ, например), когда вы читали его в из файла CSV

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

Как только у вас есть все числа, просто увеличивайте и размножайтесь. Чтобы избежать переполнения, вы можете посмотреть такие вещи, как BigInteger.

+0

Это теоретическая комбинация возможных комбинаций, о которой я уже говорил. Я хочу точно знать, сколько комбинаций возможно в моем конкретном наборе данных/таблице, а не теоретическом максимуме – user330612

+0

@ user330612 Эти значения находятся непосредственно из вашего набора данных. Что делает этот теоретический? Пожалуйста, объясните более подробно, что вы подразумеваете под теоретическим. – ryanyuyu

+0

добавлены подробности в Q сейчас – user330612