1) Откройте DataTable или Recordset, который выбирает столбец (столбцы) уникального идентификатора таблицы плюс столбцы, которые вы используете для идентификации повторяющихся строк; оператор выбора должен включать сортировку предложений по порядку в столбцах с идентификатором дубликатов. В вашем примере: ORDER BY SecName, SecSym, Number
2) Перебирайте записи, читая значения для столбцов, которые идентифицируют повторяющиеся строки.
3) Если есть какие-либо повторяющиеся строки, они будут смежными, потому что результаты были отсортированы по этим столбцам. Поэтому, если какая-либо строка имеет те же значения, что и предыдущая, она является дубликатом и должна быть удалена.
фрагмент псевдокода:
string prevSecName = null;
int prevSecSym = 0;
int prevNumber = 0;
const int idIndex = 0;
const int nameIndex = 1;
const int symIndex = 2;
const int numberIndex = 3;
var idsToDelete = new List<SomeType>();
foreach (var row in rows)
{
if (prevSecName != null && prevSecName = row[nameIndex] && prevSecSym = row[symIndex] && prevNumber = row[numberIndex])
idsToDelete.Add(row[idIndex]);
prevSecName = row[nameIndex];
prevSecSym = row[symIndex];
prevNumber = row[numberIndex];
}