SQL Server добавляет столбец и заполняет несколько строк на основе условий в нескольких столбцах

#sql-server

#sql-сервер

Вопрос:

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

 Timestamp          CPID    Con    Context    Type   Value
2018-01-01 03:11    1       2       6         8       0
2018-01-01 03:11    1       2       3         8       0
2018-01-01 03:11    1       2       3         3       100
2018-01-01 03:15    2       1       6         8       16
2018-01-01 03:15    2       1       3         8       15
2018-01-01 03:15    2       1       3         3       200
  

Я хочу добавить столбец с именем new_column и заполнить его с помощью 1s, когда Value=0 когда Context=6 . Я хочу рассматривать Timestamp, CPID и Con как группу, так что, когда для данной группы есть Context=6 , другим строкам в этой группе также присваивается 1 в new_column . Результат будет выглядеть следующим образом:

 Timestamp          CPID    Con    Context    Type   Value    new_column
2018-01-01 03:11    1       2       6         8       0       1
2018-01-01 03:11    1       2       3         8       0       1
2018-01-01 03:11    1       2       3         3       100     1
2018-01-01 03:15    2       1       6         8       16      0
2018-01-01 03:15    2       1       3         8       15      0
2018-01-01 03:15    2       1       3         3       200     0
  

Примечания: порядок строк не всегда одинаков, поэтому я не могу просто заполнять 2 строки каждый раз; Я также не могу напрямую ИЗМЕНЯТЬ таблицу, поскольку она доступна только для чтения.

Я все еще новичок в SQL, поэтому борюсь с этим.

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

1. Сохранение их в виде значения кажется плохой идеей, поскольку, если вы измените значение 1 строки, вам, возможно, придется изменить значение многих. Казалось бы, это лучший кандидат для VIEW .

2. Кроме того, если вы не можете изменить определение таблицы, потому что оно установлено в READ ONLY (я предполагаю, что база данных?) или у вас нет разрешения, то вы все равно не сможете добавить столбец в таблицу. База данных не должна находиться в READ ONLY режиме, чтобы вы могли вносить в нее изменения DDL, и у вас также должно быть разрешение на ALTER определение объекта (ов). Если вы в конечном итоге создадите VIEW , вам нужно будет сделать это в другой базе данных, если вы не можете внести изменения в другую, и использовать запрос между базами данных.

Ответ №1:

Вы можете создать view с помощью exists :

 select t.*,
      (case when exists (select 1 
                         from table t1  
                         where t1.Timestamp = t.Timestamp and t1.CPID = t.CPID and 
                               t1.Con = t.Con and (t1.Context = 6 or t1.Value = 0)
                        )
            then 1 else 0 
       end) as new_column
from table t;