Как изменить значение столбца/поля для повторяющегося идентификатора

#sql

Вопрос:

У меня есть набор данных/таблица из 50 тысяч, что-то вроде следующего:

 ID  value
100 A1
100 DC
100 DC
100 DC
105 DC
105 C9
105 DC
105 DC
110 A3
110 DC
110 DC
115 DC
115 A4
115 DC
120 C2
120 DC
120 DC
 

Я хотел бы сделать два типа изменения значения colmn.

  1. ЕСЛИ какой-либо идентификатор имеет значения, такие как A1, A2, A3… тогда я хочу сохранить эту запись, но хочу изменить другие значения на D1 для того же идентификатора.
  2. ЕСЛИ какой-либо идентификатор имеет значения, отличные от A1, A2, A3…(например, C2, C9..) тогда я хочу сохранить эту запись, но также хочу изменить другие значения на C9( потому что один из его идентификаторов имеет C9 и ту же логику.

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

 ID  value
100 A1
100 D1
100 D1
100 D1
105 C9
105 C9
105 C9
105 C9
110 A3
110 D1
110 D1
115 D1
115 A4
115 D1
120 C2
120 C2
120 C2
 

Любой намек будет оценен по достоинству.

Комментарии:

1. Я удалил несогласованные теги базы данных и аналитики. Пожалуйста, отметьте только ту базу данных, которую вы действительно используете (вы говорите, что у вас есть «таблица», поэтому я предполагаю, что вы используете базу данных SQL).

2. Почему все записи для 120 имеют C2 значение? Например , рассматривается как некоторые примеры данных, а не правило, поэтому DC также не равно A1, A2, A3… . Пожалуйста, разъясните логику расчета и что делать, если ничего из An этого и Cn нет

Ответ №1:

Используя подзапрос, мы можем получить новое значение в виде

 SELECT *
FROM (
    SELECT id, value,
    /* If first character is other than A then new value will be D1 */
    CASE
      WHEN LEFT(value,1) != 'A'
         THEN 'D1'
         ELSE value
    END as new_value
    FROM tbl
    /* Get all rows whose ID is same as A's */
    WHERE id IN (
           /* Get IDs of rows where value starts with A */
            SELECT id
            FROM tbl
            WHERE value LIKE 'A%'
    )
    UNION ALL
    SELECT id, value,
    /* If first value is not C, then query to get value for C as new value */
    CASE
      WHEN LEFT(value,1) != 'C'
        THEN (SELECT value FROM tbl WHERE id = z.id AND value LIKE 'C%')
        ELSE value
    END AS new_value
    FROM tbl AS z
    /* Get all rows whose ID is same as C's */
    WHERE id IN (
        SELECT id
        FROM tbl
        /* Get all rows starting with C and excluding A's */
        WHERE id NOT IN (
            /* Get IDs of rows where value starts with A */
            SELECT id
            FROM tbl
            WHERE value LIKE 'A%'
        )
        AND value LIKE 'C%'
    )
) AS o
ORDER BY o.id ASC;
 

Запрос состоит из 2 основных частей, которые объединяются с помощью UNION ALL . В первой части рассматривается проблема 1, а во второй-проблема 2. Вы также можете выполнить 2 запроса отдельно, чтобы решить проблему.

Рабочая Скрипка

Комментарии:

1. Спасибо @ Samir, я все еще не получил того, что хотел.

2. Я хотел сохранить Ai, для которого он появился, и если какой-либо идентификатор имеет значения, отличные от A1, A2, A3… (например, C2, C9 в моем примере, но у меня есть P1,P2.., G1, G2,….) тогда я хочу сохранить эту запись одновременно и хочу изменить другие значения на соответствующие для того же идентификатора. @Самир