Столбец UPDATE в зависимости от того, имеет ли он NULL в группе. - PullRequest
0 голосов
/ 26 июня 2019

Это может быть очень простой вопрос, но я просто не могу найти решение.

Вот пример

create table #Example
( 
    Key1 varchar(55) PRIMARY KEY,
    Key2 varchar(55),
    Key3 varchar(55),
    Key4 varchar(55)
)

insert into #Example
    select '1001', '100', NULL, NULL
    union all
    select '1002', '100', NULL, NULL
    union all
    select '1003', '200', NULL, NULL

Ключ1 уникален.Мы устанавливаем Key3, используя следующую логику:

with UpdateKey3 as
(
    select 
        Key1, Key2,
        ROW_NUMBER() OVER (PARTITION BY Key2 ORDER BY Key1 DESC) as RN
    from 
        #Example
)
update ao
set Key3 = m.Key1
from #Example ao
inner join UpdateKey3 m ON ao.Key2 = m.Key2
where m.RN = 1

Таблица выглядит следующим образом

enter image description here

Я хочу, чтобы Key4 был:

Поскольку любая конкретная группа Key3 имеет значения Key4 все NULL, установите для нее значение Key3.Результат должен быть таким:

enter image description here

Теперь, предположим, добавление еще 1 строки:

insert into #Example
    select '1004', '100', NULL, NULL

И затем мы запускаем запрос UpdateKey3, результатстанет:

enter image description here

Теперь нам нужно **** запрос, который обновит Key4.Поскольку новая строка в группе Key3 = 1004, и мы уже ранее заполнили Key4 для этой группы, NULL должен стать 1002. Окончательный результат

Ака, как только мы установим Key4 для любой конкретной группировки Key3, Key4 никогда не должен изменяться,Что бы это был за **** запрос?

enter image description here

1 Ответ

1 голос
/ 27 июня 2019

Это немного сложно, но я думаю, что вижу, что вы говорите:

Если key4 равно нулю ...

  • Попробуйте найти другую запись с помощьюто же значение key3, и посмотрите, что он говорит для key4.
  • Если какая-либо из таких записей имеет значение key4, используйте его
  • Иначе просто используйте значение ключа 3 текущей записи

С учетом этого для обновления ключа 4, вы могли бы хотеть такую ​​процедуру:

update    #Example
set       key4 = 
              isnull(
                  (
                      -- You have more than one row meeting your criteria.
                      -- Which do you choose.  I have a top 1, but order by what?
                      select 
                      top 1   key4 
                      from    #example sub 
                      where   #Example.key3 = sub.key3 
                      and     sub.key4 is not null
                  ), 
                  key3
              )
where     key4 is null

Я подчеркиваю «возможно», потому что ваше утверждение (которое я перевел во вторую пулю выше) :

Поскольку новая строка находится в группе Key3 = 1004, и мы уже ранее заполнили Key4 для этой группы, значение NULL должно стать 1002.

не учитываетвероятность того, что две ранее существующие группы ключей 3 из 1004 могут иметь разные значения ключа 4.Да, в вашем примере они оба 1002, но в будущем они не всегда будут.

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

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