#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;