Прочитать физический файл, сохранить наибольшее количество и удалить все остальные с тем же аргументом поиска - PullRequest
0 голосов
/ 24 октября 2018

Я делаю программу, которая читает все записи в физическом файле с использованием логического файла (код транзакции, дата транзакции и сумма транзакции), проверяет, есть ли 2 или более записей с одинаковым кодом транзакции и датой транзакции, и определяет, чтонаибольшее количество.Я должен сохранить запись с наибольшим количеством и удалить (удалить флаг = 'D') другие (с тем же кодом транс и датой трансляции).

Как я узнаю, что это за запись с наибольшим количеством?Я имею в виду, если есть 1000 записей, и я нашел 7 идентичных кодов транс и даты трансляции, если наибольшая сумма - 7-я запись, как мне удалить записи с 1 по 6, когда после чтения файла указатель файла переходит к следующей записи, верно??

Я прошу прощения, если это сбивает с толку.Это меня смущает.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Очевидно, мне не хватает представителя, чтобы комментировать, но подход, который использует jmarkmurphy, является правильным.Это не операция, для которой требуется программа, это быстрый sql, и подход jmarkmurphy верен.Проблема, однако, состоит в том, что, когда есть две записи с одинаковым кодом транс, датой и суммой, вы все равно будете иметь дубликаты записей.Начните с вышеприведенного запроса (добавив дату транс, так как вы упомянули, что нужно соответствовать этому):

exec sql
  update table a
    set deletecode = 'D'
    where amount <> (select max(amount) from table
                     where trancd = a.trancd and trandate = a.trandate)

Затем удалите все дубликаты:

exec sql
  update table a
    set deletecode = 'D'
    where rrn(a) > (select min(rrn(b)) from table b
                     where a.trancd = b.trancd and a.trandate = b.trandate and a.amount = b.amount)
0 голосов
/ 25 октября 2018

Я бы использовал встроенный SQL для чего-то вроде этого.Не зная формата вашей таблицы, вы можете использовать агрегацию, чтобы найти записи для обновления, что-то вроде этого:

exec sql
  update table a
    set deletecode = 'D'
    where amount <> (select max(amount) from table
                     where trancd = a.trancd);

Это работает, находя max(amount) для строк с тем же trancd, что иодин обновляется.Если сумма в обновляемой строке отличается от max(amount) для этого trancd, тогда обновите deletecode, в противном случае не обновляйте его.Нет необходимости проверять наличие двух или более записей, поскольку при наличии только одной записи поле max(amount) будет таким же, как поле amount в транзакции, которая будет обновлена.

...