Это, возможно, было на самом деле опубликовано, но рекомендованные вопросы не показали никакого света, и поиск правильных слов для заголовка был самой задачей.
Учитывая эти 3 столбца, я пытаюсь найти правильный SQL-запросдля управления дубликатами при определенных условиях:
ColumnA | ColumnB | ColumnC
---------------------------
1 | 1 | A
1 | 2 | A
2 | 2 | B
2 | 2 | A
2 | 2 | B
1 | 2 | B
Таким образом, мой счетчик должен быть счетчиком вхождений - условие C Правило состоит в том, что ColumnA можно назначить номеру ColumnB, где ColumnC равен A или Bи это считается как 1. Если ColumnA назначен на номер ColumnB и имеет второй A или B в ColumnC, то это считается как 2. (1/1 / A 1/1 / B = 1) (1/1 / A1/1 / A = 2).
После этого приведенная выше таблица равна 4:
- 1/1 / A = 1
- 1/2 / A = 1
- 2/2 / B = 1
- 2/2 / A = 0
- 2/2 / B = 1
- 1/2 / B = 0
В C # я сделалнекоторое управление для хранения значений и сравнения перечислителей, чтобы проверить это
//If the hash table fails to add due to a duplicate then thats a second count of it existing (and breaks the rule of 1 per A and B
if(!hash.Add(new Tuple<int, int, ColumnType>(itemA.ColumnA, itemA.ColumnB, itemA.ColumnC)))
{
count++;
}
else
{
//If the table contains the counter part (so if this is 1/1/A is there a 1/1/B)
if(hash.Contains(new Tuple<int, int, ColumnType>(itemA.ColumnA, itemA.ColumnB, (itemA.ColumnC == ColumnType.A ? ColumnType.B : ColumnType.A))))
{
//There is so take a point off as thats allowed
count--;
}
else
{
//The item was added to the hash table normally and theres no counter part
count++;
}
}
Конечно, я смотрю на повышение эффективности, использование хэш-набора яs замена другого класса, который просто работает над добавлением и повторением словаря, который был медленнее.Это быстрее, чем это, и я предполагаю, что прямая ссылка на счет через команду SQL будет еще быстрее.