Как установить совокупное значение бита для группы - PullRequest
1 голос
/ 21 мая 2019

Мне нужно «свернуть» значения битов для группы в моей таблице через UPDATE.Поэтому, если для одной строки в группе установлен бит в значение true, мне нужно установить для других строк в группе значение true.

Например, у меня есть такая таблица:

GroupID | Type   | BitA | BitB
------------------------------
   1    | Parent |  0   |  0
   1    | Child  |  1   |  0
   2    | Parent |  0   |  0
   2    | Child  |  1   |  1
   2    | Child  |  0   |  1
   3    | Parent |  0   |  0
   3    | Child  |  0   |  0

Ожидаемый результат после оператора UPDATE будет следующим:

GroupID | Type   | BitA | BitB
------------------------------
   1    | Parent |  1   |  0
   1    | Child  |  1   |  0
   2    | Parent |  1   |  1
   2    | Child  |  1   |  1
   2    | Child  |  0   |  1
   3    | Parent |  0   |  0
   3    | Child  |  0   |  0

Поскольку для Group 1 для Child с BitA установлено значение true, для Parent также должно быть установлено значение true.

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

SELECT
   MAX(CAST(BitA as int)),
   MAX(CAST(BitB as int))
FROM MyTable
WHERE Type = 'Child'
GROUP BY GroupID

Есть ли более простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Кажется, вы хотите установить родительские флаги на основе дочерних элементов:

with toupdate as (
      select t.*,
             max(BitA) over (partition by groupid) as max_bitA,
             max(BitB) over (partition by groupid) as max_bitB
      from mytable t
     )
update toupdate
    set BitA = max_BitA,
        BitB = max_BitB
    where BitA <> max_BitA or BitB <> max_BitB;

Если ваши биты действительно набраны как bit, вам нужно несколько преобразований:

with toupdate as (
      select t.*,
             convert(bit, max(convert(int, BitA)) over (partition by groupid)) as max_bitA,
             convert(bit, max(convert(int, BitB)) over (partition by groupid)) as max_bitB
      from mytable t
     )
update toupdate
    set BitA = max_BitA,
        BitB = max_BitB
    where BitA <> max_BitA or BitB <> max_BitB;
0 голосов
/ 21 мая 2019

это может дать вам то, что вам нужно ...

UPDATE M1
SET M1.BITA = 1,
    M1.BITB = 1
FROM MYTABLE M1
WHERE EXISTS
(
SELECT 1
  FROM MYTABLE M2
 WHERE M2.GroupID = M1.GoupID
      AND
     (
        M2.BITA = 1
       OR M2.BITB = 1
  )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...