обновить столбец в SQL, используя два условия - PullRequest
0 голосов
/ 31 октября 2019

У меня есть таблица в mysql, в которой я хочу обновить записи в столбце с именем status до «Duplicate». Я хочу отметить запись как «дубликат» на основе 2 условий.

  1. Записи имеют дубликат идентификатора клиента.

  2. Эти записи, которыеесли дата последнего изменения не будет помечена как дубликат.

attaching the image of the data for the reference

Я пробовал приведенный ниже код, но он выдает ошибку:

UPDATE test_sql_duplicate
SET status = 'Duplicate'
WHERE test_sql_duplicate.modi_date NOT IN (
    SELECT *, max(modi_date) 
    FROM test_sql_duplicate
    GROUP BY cust_id 
    HAVING COUNT(cust_id > 1)

Ответы [ 4 ]

0 голосов
/ 31 октября 2019

Вот быстрый и грязный способ:

    UPDATE test_sql_duplicate SET status = 'Duplicate' 
    WHERE cust_id IN (
       SELECT t.id FROM (
          SELECT 
             modi_date date,
             cust_id id, 
             COUNT(*) OVER(PARTITION BY cust_id) cnt,
             MAX(modi_date) OVER() maxDate 
             FROM test_sql_duplicate
          ) t 
       WHERE t.date < maxDate OR t.cnt > 1);
0 голосов
/ 31 октября 2019

Я подозреваю, что мы можем запросить что-то вроде этого:

 UPDATE TEST_SQL_DUPLICATE t
   JOIN ( 
          SELECT n.cust_id
               , MAX(n.modi_date) AS max_modi_date
            FROM TEST_SQL_DUPLICATE n
           GROUP
              BY n.cust_id
          HAVING COUNT(n.cust_id) > 1
      ) d
    ON d.cust_id       = t.cust_id
   AND d.max_modi_date > t.modi_date
   SET t.status = 'Duplicate'

Приведенные примеры данных:

 _row  cust_id    modi_date
       -------   ----------
    1      444   2019-10-28
    2      444   2019-10-28
    3      444   2019-10-29
    4      444   2019-10-30
    5      444   2019-10-30

запрос в этом ответе помечает строки от 1 до3, установите для столбца status значение 'Duplicate'. Строки 4 и 5 не будут помечены, потому что они обе имеют одинаковый (максимальный) modi_date.

Мы бы также достигли того же результата, если бы опускали предложение HAVING в запросе встроенного представления.

0 голосов
/ 31 октября 2019

Вы можете использовать LEFT JOIN antipattern, чтобы идентифицировать записи для обновления. В основном мы используем подзапрос, чтобы определить самую последнюю запись для каждого клиента, затем мы используем ее для исключения соответствующей записи из запроса на обновление:

UPDATE test_sql_duplicate t
LEFT JOIN (
    SELECT cust_id, MAX(modi_date) modi_date FROM test_sql_duplicate GROUP BY cust_id
) m ON m.cust_id = t.cust_id and m.modi_date = t.modi_date
SET t.status = 'Duplicate'
WHERE m.cust_id IS NULL
0 голосов
/ 31 октября 2019

Для объединения условий используйте AND (также можно использовать OR). Пример:

`SELECT *
FROM products
WHERE department = 'beverages'
AND price < 15
AND distributer = 'prairie farms';`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...