Объединить одно поле после GROUP BY
Этот вопрос задавался много раз в SO, но ни один из ответов не удовлетворяет моей ситуации.
Я имею дело с DataObjectVersions
таблица, которая содержит несколько версий для около 1,2 миллиона уникальных объектов (и увеличивается). Мне нужно объединить изменения из определенного поля для каждого уникального объекта.
Прямо сейчас я использую решение с XML Path, представленным в Q3, но выполнение такого запроса к этой таблице - это общая ошибка производительности. SQL Server начал перенастраивать данные после 19 мин. Зная, что эти данные будут соединены дважды, вы сможете представить себе влияние.
Я ищу наиболее эффективный способ с учетом масштабируемости объединить значения одних и тех же полей разных строк, сгруппированных по другому полю (что, конечно, не является ключевым). Чтобы быть более точным, это используется в представлении в Datawarehouse.
РЕДАКТИРОВАТЬ:
Я попытался упростить описание, но вот полный обзор, у меня есть несколько таблиц со следующими столбцами
[Я БЫ] [CreatedTime] [Создано] [DeletedTime] [DeletedBy] [ResourceId] [AccountId] [Тип]
Представление используется для возврата объединения всех записей из всех таблиц, которые будут возвращать те же столбцы (описанные в моих вопросах в таблице версий). [ResourceId]
а также [AccountId]
являются уникальным составным идентификатором объекта (членство в группе, системная учетная запись и т. д., в частности, назначение ресурса). [Type]
используется для определения различных уровней (например, чтение / запись / выполнение в случае назначения файла)
Все остальные поля содержат одинаковые значения (в разных таблицах) для разных уникальных объектов. Мне нужно получить объекты и объединить значения [Type]
колонка. Все строки обрабатываются позже и ([ResourceId]
,[AccountId]
) комбинация должна быть уникальной (кроме случаев, когда существуют разные типы).
РЕДАКТИРОВАТЬ 2:
Я использую эту функцию:
CREATE FUNCTION [dbo].[GetUniqueType]
(
@ResourceId as uniqueidentifier,
@Account as uniqueidentifier
)
RETURNS nvarchar(100)
AS
BEGIN
return STUFF((select ',' + raType.Type from vwAllAssignments raType where raType.AccountId = @Account and raType.ResourceId = @ResourceId and raType.DeletedBy is null for xml path('')), 1,1,'')
END
GO
vwAllAssignments
это представление, возвращающее объединение всех строк таблицы.
Наконец я выбираю
SELECT [CreatedTime]
,[DeletedTime]
,[DeletedBy]
,[ResourceId]
,[AccountId]
,dbo.GetUniqueType([ResourceId],[AccountId]) AS [Type]
FROM vwAllAssignments
GROUP BY [ResourceId], [AccountId], [CreatedTime], [DeletedTime], [DeletedBy]
1 ответ
Попробуй это:
SELECT [CreatedTime]
,[DeletedTime]
,[DeletedBy]
,[ResourceId]
,[AccountId]
,STUFF((select ',' + raType.Type
from vwAllAssignments raType
where raType.AccountId = vwAllAssignments.AccountId and
raType.ResourceId = vwAllAssignments.ResourceId and
raType.DeletedBy is null
for xml path('')), 1,1,'') AS [Type]
FROM vwAllAssignments
GROUP BY [ResourceId], [AccountId], [CreatedTime], [DeletedTime], [DeletedBy]
И такой индекс должен быть полезным.
create index IX_vwAllAssignments on vwAllAssignments(AccountId, ResourceId, DeletedBy) include(Type)