Объединить одно поле после GROUP BY

Этот вопрос задавался много раз в SO, но ни один из ответов не удовлетворяет моей ситуации.

  1. Вопрос 1
  2. вопрос 2
  3. Вопрос 3
  4. Вопрос 4

Я имею дело с 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)
Другие вопросы по тегам