복붙노트

[SQL] GROUP BY 후 연결하여 하나의 필드

SQL

GROUP BY 후 연결하여 하나의 필드

이 질문은 SO에 여러 번 요청을받은하지만 답변을 아무도 내 상황에 만족하지 않습니다.

나는 120 만 주위의 고유 객체 (그리고 증가)에 대한 여러 버전을 포함하는 DataObjectVersions 테이블을 취급하고 있습니다. 나는 각각의 고유 한 개체에 대한 특정 필드에서 CONCATENATE 변경해야합니다.

지금 내가 Q3에서 XML 패스와 함께 솔루션을 발표 사용하지만,이 테이블에 이러한 쿼리를 실행하고하면 전체 성능 재해입니다. SQL Server는 1,900 후 데이터를 retun하기 시작했다. 이 데이터가보다 두 배 합류 될 것으로 알고, 당신은 영향을 상상할 수있다.

나는 (물론 키의하지 않은)는 다른 필드로 그룹화 다른 행의 같은 필드의 값을 연결하는 가장 효율적인 확장 성을 인식하는 방법을 찾고 있어요. 더 정확히 말하면, 이것은 데이터웨어 하우스에서보기 내에서 사용된다.

편집하다:

나는 설명을 단순화하기 위해 시도했지만 여기에 전체 개요입니다 나는 다음과 같은 열이있는 여러 테이블을

   [ID]
   [CreatedTime]
   [CreatedBy]
   [DeletedTime]
   [DeletedBy]
   [ResourceId]
   [AccountId]
   [Type]

전망은 여전히 ​​같은 열을 반환하는 모든 테이블의 모든 레코드의 조합을 반환하는 데 사용됩니다 (버전 테이블이 내 질문에 설명). [의 ResourceId] 및 [통해 AccountId (즉 그룹 구성원 시스템 계정 등의 자원 할당) 오브젝트의 고유 식별자를 합성한다. 에서 [유형]이 서로 다른 수준의 식별하는 데 사용됩니다 (읽기 / 쓰기 등으로 / 과제 파일의 경우 실행)

다른 모든 필드는 다른 고유 한 객체 (다른 테이블에서) 동일한 값이 포함되어 있습니다. 나는 개체를 얻고 [유형] 열의 값을 연결해야합니다. 전체 (다른 유형이 존재하지 않는 경우)를 행 이후 처리하고 ([의 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. ==============================

    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)
    
  2. from https://stackoverflow.com/questions/13647394/concatenate-one-field-after-group-by by cc-by-sa and MIT license