Доступ удаляет все, кроме максимального значения

Я пытаюсь обрезать таблицу Access (загрязнение), полную дубликатов и конкатенированных значений.

Таблица выглядит так:

FederalSiteIdentifier Contam
001 1
001 1, 2
001 1, 2, 3
001 1, 2, 3, 4
002 1
003 1
003 1, 2
003 1, 2, 3

Я только хочу сохранить последнюю - самую длинную запись для каждого идентификатора, но не могу найти правильный способ сделать это в Access SQL.

После некоторого чтения я попробовал этот простой код:

SELECT FederalSiteIdentifier, Max(Contam) as MaxCont
FROM contam
ORDER BY FederalSiteIdentifier

который вызывает ошибку.

Может ли кто-нибудь помочь?

1
nl ja de
Я подозреваю, что это будет совокупность без группы по ошибке ...
добавлено автор twoleggedhorse, источник
Наверняка, вы будете сглаживать этот файл на каком-то этапе? Если это так, было бы намного проще и безопаснее удалить после сглаживания файла.
добавлено автор Fionnuala, источник
Какую ошибку вы получаете?
добавлено автор imreal, источник

2 ответы

MAX является агрегированной функцией, вы можете делать это только при использовании оператора GROUP BY. Доступ также очень необычен в том, как он может удалять записи. Вы не можете оставить соединение и удалить, поэтому вам нужно определить записи, которые вы не хотите, а затем удалить их.

Создайте новый столбец, чтобы мы могли сохранить записи.

ALTER TABLE contam ADD Keep BIT NOT NULL DEFAULT 0;

Теперь определите записи и обновите таблицу

UPDATE c
SET    keep = 1
FROM   contam AS c
       INNER JOIN (
                  SELECT FederalSiteIdentifier, Max(Len(Contam)) as MaxCont
                  FROM contam
                  GROUP BY FederalSiteIdentifier
                  ORDER BY FederalSiteIdentifier
                  ) AS maxc
         ON c.FederalSiteIdentifier = maxc.FederalSiteIdentifier
         AND Len(c.Contam) = maxc.MaxCont;

Обратите внимание на строку GROUP BY ... вот что вы пропустили, что дало вам ошибку.

Наконец, выполните удаление

 DELETE FROM contam
 WHERE keep = 0;

Теперь вы можете удалить дополнительную колонку

ALTER TABLE contam DROP COLUMN Keep;

Долго наматывается, но ты туда.

0
добавлено
Я изменил свой ответ, это будет работать правильно. Вчера вечером кофе не хватало.
добавлено автор twoleggedhorse, источник

Я думаю, вам нужна максимальная длина значений Contam для каждого FederalSiteIdentifier . Вам понадобится предложение GROUP BY .

SELECT FederalSiteIdentifier, Max(Len(Contam)) as MaxCont
FROM contam
GROUP BY FederalSiteIdentifier

Если этот запрос идентифицирует строки, которые вы хотите сохранить, сохраните их как qryRows2Keep , затем попробуйте этот DELETE запрос:

DELECT FROM contam
WHERE
    Len(Contam) < DLookup(
            "MaxCont",
            "qryRows2Keep", 
            "FederalSiteIdentifier = '" & FederalSiteIdentifier & "'")

Я предположил, что FederalSiteIdentifier - это текстовый тип данных. Если это числовое значение, отбросьте одинарные кавычки из выражения DLookup .

Перед попыткой этого непроверенного предложения убедитесь, что вы сохранили данные. :-)

0
добавлено
Я переработал верхний бит кода, и он сделал именно трюк, мне не нужно было удалять, просто отфильтровать его до такой степени, что я могу загрузить его в электронную таблицу. Огромное спасибо!
добавлено автор Will, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)