Как написать запрос на удаление всего, кроме максимального значения, сгруппированного по идентификатору? - PullRequest
2 голосов
/ 29 января 2020

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

  1. Ищите максимальное значение, доступное для столбца ID в столбце Значение (SELECT * FROM TABLE WHERE VALUE IN (SELECT MAX(VALUE) FROM TABLE GROUP BY ID)

Пример:

Данные таблицы:

ID - значение

a - 1

a - 2

a - 3

b - 2

c - 3

Выход:

ID - значение

a - 3

b - 2

c - 3

Игнорировать результаты из пункта 1 в таблице (SELECT * FROM TABLE WHERE NOT EXISTS ((SELECT * FROM TABLE WHERE VALUE IN (SELECT MAX(VALUE) FROM TABLE GROUP BY ID))

Редактировать: я написал запрос, который в итоге выводит требуемый результат для точки 2

SELECT t1.* FROM TABLE t1 
  LEFT JOIN
  ( 
    SELECT 1 AS aux, * FROM (SELECT * FROM TABLE
    WHERE VALUE IN 
    (SELECT MAX(VALUE) FROM TABLE group by ID))
  ) t2
  ON 
  t2.ID= t1.ID
  and 
  t2.VALUE= t1.VALUE
  WHERE t2.aux IS NULL

Пример:

Данные таблицы:

ID - значение

a - 1

a - 2

a - 3

b - 2

c - 3

Выход:

ID - значение

a - 1

a - 2

Используйте запрос точки 2 для удаления строк из таблицы (DELETE FROM TABLE WHERE (ID,VALUE) IN (SELECT * FROM TABLE WHERE NOT EXISTS ((SELECT * FROM TABLE WHERE VALUE IN (SELECT MAX(VALUE) FROM TABLE GROUP BY ID)))

Пример:

Данные таблицы:

ID - значение

a - 1

a - 2

a - 3

b - 2

c - 3

Табличные данные:

ID - значение

a - 3

b - 2

c - 3

Точка 2 не работает, не дает результатов. Когда проверяется итоговая строка вывода запроса из точки 2 и итоговая строка таблицы, возникает различие.

Поскольку точка 2 не работает, точка 3 также не работает. Что я делаю не так?

1 Ответ

1 голос
/ 29 января 2020

После нашего обсуждения я понимаю, что вы пытались выбрать много строк данных, которые соответствуют фильтру id и max (значение) . Поэтому я могу предложить вам следующий скрипт:

SELECT
  DISTINCT a.*
FROM
  `test-proj-261014.sample.id_value` a
RIGHT JOIN (
  SELECT
    id,
    MAX(value) AS max_val
  FROM
    `test-proj-261014.sample.id_value`
  GROUP BY
    id
  ORDER BY
    id) b
ON
  a.id = b.id
  AND a.value = b.max_val
WHERE
  a.value IS NOT NULL
ORDER BY
  id;

Не то чтобы я использовал SELECT DISTINCT , который не будет выбирать дублированные данные. Кроме того, из-за возможности существования нулевых значений я добавил условие *** WHERE a.value NOT NULL ***, которое не будет выбирать строки, не соответствующие условию.

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

SELECT
  a.*
FROM
  `test-proj-261014.sample.id_value` a
LEFT JOIN (
  SELECT
    id,
    MAX(value) AS max_val
  FROM
    `test-proj-261014.sample.id_value`
  GROUP BY
    id
  ORDER BY
    id) b
ON
  a.id = b.id
  AND a.value = b.max_val
WHERE
  b.max_val IS NULL
ORDER BY
  id;

Этот запрос извлекает все значения, которых нет в окончательном выводе, созданном первым запросом. Это поможет вам лучше понять данные, с которыми вы имеете дело.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...