Как выбрать наиболее заполненную запись? - PullRequest
0 голосов
/ 02 июля 2010

Мне повезло, что мне пришлось иметь дело с БД, которая содержит дубликаты определенных записей, я ищу быстрый способ сказать «получить наиболее заполненную запись и обновить дубликаты, чтобы соответствовать ей».

Оттуда я могу выбрать отдельные записи и получить полезный набор записей.

Есть идеи?

В основном это имена и адреса, если это помогает ...

Хорошо, здесь задано много вопросов, поэтому я добавлю немного больше:

Во-первых, я хочу выбрать наиболее «заполненные», а не наиболее «популярные», это означает строку с большинством значений, которые не равны нулю.

Когда у меня есть набор (что легко, потому что в моем случае совпадает идентификатор), я могу заполнить пропущенные значения в других строках.

Я не хочу уничтожать данные и собираюсь обновлять данные только на основе точного соответствия (например, по идентификатору).

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

Пример данных может выглядеть примерно так ...

id   name     addr1            addr2       ect
1    fred     1 the street     Some town   ...
1    fred     null             null        null

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

1 Ответ

0 голосов
/ 02 июля 2010

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

Я предположил, что дубликаты определяются столбцом с именем "name". Вам нужно будет скорректировать на основе вашего определения дубликатов. Кроме того, поскольку вы не дали никаких правил о том, как обращаться со связями для «самых населенных», я просто выбрал строку с самым низким идентификатором.

UPDATE
    T1
SET
    col_1 = T2.col_1,
    col_2 = T2.col_2,
    ....
FROM
    My_Table T1
INNER JOIN My_Table T2 ON
    T2.name = T1.name AND
    T2.id =
    (
        SELECT TOP 1
            T3.id
        FROM
            My_Table T3
        WHERE
            T3.name = T1.name
        ORDER BY
            CASE WHEN col_1 IS NOT NULL THEN 1 ELSE 0 END +
            CASE WHEN col_2 IS NOT NULL THEN 1 ELSE 0 END +
            ... DESC,
            id ASC
    )

РЕДАКТИРОВАТЬ: Я просто перечитал ваш вопрос, и вы упомянули: «Оттуда я могу выбрать отдельные записи и получить полезный набор записей». Если это именно то, что вам действительно нужно, не беспокойтесь об обновлении других строк, просто выберите те, которые вам нужны, и оставьте все остальное без изменений:

SELECT
    T1.id,
    T1.name,
    T1.col_1,
    T1.col_2,
    ...
FROM
    My_Table T1
WHERE
    T1.id =
    (
        SELECT TOP 1
            T2.id
        FROM
            My_Table T2
        WHERE
            T2.name = T1.name
        ORDER BY
            CASE WHEN T2.col_1 IS NOT NULL THEN 1 ELSE 0 END +
            CASE WHEN T2.col_2 IS NOT NULL THEN 1 ELSE 0 END +
            ... DESC,
            T2.id ASC
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...