У меня есть таблица T1, которая имеет пару столбцов, скажем, 10 столбцов.Я хотел бы сгруппировать данные по значениям 5 столбцов, скажем, от param1 до param5 и назначить group # этим уникальным строкам.Затем я хотел бы добавить новый столбец в исходную таблицу T1 и добавить соответствующий номер группы в каждую строку.
Вот шаги, которые я предпринял:
Шаг 1 - Сохранение уникальных строк T1 в таблице temp2 таблицы и назначение номеров групп
IF OBJECT_ID('temp2', 'U') IS NOT NULL DROP TABLE temp2
select param1, param2, param3, param4, param5,
ROW_NUMBER() OVER(ORDER BY min(Row#) ASC) AS Group#
into temp2
from T1
group by param1, param2, param3, param4, param5
Шаг 2 - Созданиекопия исходной таблицы в temp3 с дополнительной группой столбцов # из таблицы temp2
IF OBJECT_ID('temp3', 'U') IS NOT NULL DROP TABLE temp3
select t1.*, t2.Group#
into temp3
from T1 as t1 Left JOIN temp2 as t2
ON (
((t1.param1=t2.param1) OR (ISNULL(t1.param1,t2.param1) IS NULL)) AND
((t1.param2=t2.param2) OR (ISNULL(t1.param2,t2.param2) IS NULL)) AND
((t1.param3=t2.param3) OR (ISNULL(t1.param3,t2.param3) IS NULL)) AND
((t1.param4=t2.param4) OR (ISNULL(t1.param4,t2.param4) IS NULL)) AND
((t1.param5=t2.param5) OR (ISNULL(t1.param5,t2.param5) IS NULL))
)
Шаг 3 - Заменить T1 на temp3
Код работает нормально, но для его улучшения у меня естьу меня на уме следующие вопросы:
Q1 - Является ли код на шаге 1 лучшим способом присвоения номера группы уникальным строкам?
Q2 - На шаге 2 существует ли векторизованный способсопоставить строки таблицы 2 с таблицей 1, когда мы хотим сравнить несколько параметров?
Q3 - На шаге 2 я бы хотел сопоставить два значения, если оба одинаковы или оба равны NULL.Является ли утверждение, что я имею лучший способ сделать это?
Q4 - Могу ли я пропустить шаг 3 и напрямую обновить исходную таблицу на шаге 2?
Пожалуйста, поделитесь своими мыслями, если есть еще способы улучшить этот код.