복붙노트

[SQL] 없는 그룹에 의해 SQL에서 열을 선택합니다

SQL

없는 그룹에 의해 SQL에서 열을 선택합니다

나는 SQL의 그룹에 의해 문에 포함되지 않은 비 집계 열을 선택하는 방법에 대한 몇 가지 정보를 찾을려고 노력했지만, 내가 찾은 것은 지금까지 내 질문에 대답 것 같다. 나는 그것에서 원하는 것을 나는 3 열이있는 테이블이 있습니다. 하나는 한 그룹은 특정 청구 ID에 의해 기록하고, 최종의 PK하다는 ID이고, A는 일을 생성한다. 나는 제 ID의 각 그룹의 최대 생성 날짜가 기록을 찾고 싶어요. 나는 MAX (작성 날짜) 및 청구 ID (cpe.fmgcms_cpeclaimid)을 선택하고, 청구 ID에 의해 그룹화하고 있습니다. 하지만이 기록 (cpe.fmgcms_claimid)에서 PK를해야하고, 내 선택 조항에 추가하려고하면 오류가 발생합니다. 다음은 내 의도 한 그룹을 던질 것 때문에 나는 절에 의해 내 그룹에 추가 할 수 없습니다. 사람이에 대한 대안을 알고 있나요? 여기에 내 코드의 샘플입니다 :

Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid 
from Filteredfmgcms_claimpaymentestimate cpe
where cpe.createdon < 'reportstartdate'
group by cpe.fmgcms_cpeclaimid

이것은 내가 좀하고 싶습니다 결과입니다 :

Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid, cpe.fmgcms_claimid 
from Filteredfmgcms_claimpaymentestimate cpe
where cpe.createdon < 'reportstartdate'
group by cpe.fmgcms_cpeclaimid

해결법

  1. ==============================

    1.GROUP BY 절과 함께 선택 쿼리의 결과 집합의 열은해야합니다 :

    GROUP BY 절과 함께 선택 쿼리의 결과 집합의 열은해야합니다 :

    그래서, 당신은 하나의 간단한 쿼리에서 수행 할 작업을 할 수 없습니다. 먼저 할 일은 명확한 방법으로 문제 문을 명시하고, 같은 :

    주어진

    create table dbo.some_claims_table
    (
      claim_id     int      not null ,
      group_id     int      not null ,
      date_created datetime not null ,
    
      constraint some_table_PK primary key ( claim_id                ) ,
      constraint some_table_AK01 unique    ( group_id , claim_id     ) ,
      constraint some_Table_AK02 unique    ( group_id , date_created ) ,
    
    )
    

    먼저 할 일은 각 그룹에 대해 가장 최근에 생성 날짜를 확인할 수 있습니다 :

    select group_id ,
           date_created = max( date_created )
    from dbo.claims_table
    group by group_id
    

    에 가상 테이블로 요구 사항의 첫 번째 부분 (각 그룹에서 개별 행을 선택을 fullfill에 해당 요구를. : 그것은 당신에게 선택 (GROUP_ID과 highwater 만든 날짜 2 열 그룹 당 1 행) 당신이 필요로하는 기준을 제공합니다 최종 선택 쿼리 :

    select *
    from dbo.claims_table t
    join ( select group_id ,
           date_created = max( date_created )
           from dbo.claims_table
           group by group_id
          ) x on x.group_id     = t.group_id
             and x.date_created = t.date_created
    

    GROUP_ID (AK02) 내에서 DATE_CREATED하여 테이블이 고유하지 않으면 당신은 주어진 그룹에 대한 중복 행을 얻을 수 있습니다.

  2. ==============================

    2.당신은 파티션과 RANK하여이 작업을 수행 할 수 있습니다 :

    당신은 파티션과 RANK하여이 작업을 수행 할 수 있습니다 :

    select * from
    (
        select MyPK, fmgcms_cpeclaimid, createdon,  
            Rank() over (Partition BY fmgcms_cpeclaimid order by createdon DESC) as Rank
        from Filteredfmgcms_claimpaymentestimate 
        where createdon < 'reportstartdate' 
    ) tmp
    where Rank = 1
    
  3. ==============================

    3.직접 대답은 당신이 할 수없는 것입니다. 당신은 집계 또는으로 그룹화되어 뭔가 하나를 선택해야합니다.

    직접 대답은 당신이 할 수없는 것입니다. 당신은 집계 또는으로 그룹화되어 뭔가 하나를 선택해야합니다.

    그래서, 당신은 다른 접근 방식이 필요합니다.

    1). 당신에게 현재 쿼리를 가지고 그것의 기본 데이터 다시 가입

    SELECT
      cpe.*
    FROM
      Filteredfmgcms_claimpaymentestimate cpe
    INNER JOIN
      (yourQuery) AS lookup
        ON  lookup.MaxData           = cpe.createdOn
        AND lookup.fmgcms_cpeclaimid = cpe.fmgcms_cpeclaimid
    

    2). 모두 한 번에 그것을 할 수있는 CTE를 사용하여 ...

    WITH
      sequenced_data AS
    (
      SELECT
        *,
        ROW_NUMBER() OVER (PARITION BY fmgcms_cpeclaimid ORDER BY CreatedOn DESC) AS sequence_id
      FROM
        Filteredfmgcms_claimpaymentestimate
      WHERE
        createdon < 'reportstartdate'
    )
    SELECT
      *
    FROM
      sequenced_data
    WHERE
      sequence_id = 1
    

    참고 : fmgcms_cpeclaimid 당 하나의 기록을 보장 ROW_NUMBER ()를 사용. 여러 레코드가 동일한 createdon 값으로 묶여있다하더라도. 당신은 관계를 가지고 있고, 대신에 동일한 createdon 값을 사용 RANK () 모든 기록을하고자 할 수 있습니다.

  4. ==============================

    4.당신은 PK를 얻기 위해 자신의 표를 가입 할 수 있습니다 :

    당신은 PK를 얻기 위해 자신의 표를 가입 할 수 있습니다 :

    Select cpe1.PK, cpe2.MaxDate, cpe1.fmgcms_cpeclaimid 
    from Filteredfmgcms_claimpaymentestimate cpe1
    INNER JOIN
    (
        select MAX(createdon) As MaxDate, fmgcms_cpeclaimid 
        from Filteredfmgcms_claimpaymentestimate
        group by fmgcms_cpeclaimid
    ) cpe2
        on cpe1.fmgcms_cpeclaimid = cpe2.fmgcms_cpeclaimid
        and cpe1.createdon = cpe2.MaxDate
    where cpe1.createdon < 'reportstartdate'
    
  5. ==============================

    5.당신이, 선생님을 요구하는 것은 RedFilter의 답변으로 있습니다. 그룹에 의해 어떻게 든 이상 간단한 버전 또는 파티션 왜이 답변뿐만 아니라 이해하는 데 도움이 : SQL 서버 : PARTITION BY와 GROUP BY의 차이 그것은 반환 값이 계산되는 방식을 변경하기 때문에 당신은 (어떻게 든) 반환 할 수 없습니다에 의해 열 그룹을 반환 할 수 있기 때문이다.

    당신이, 선생님을 요구하는 것은 RedFilter의 답변으로 있습니다. 그룹에 의해 어떻게 든 이상 간단한 버전 또는 파티션 왜이 답변뿐만 아니라 이해하는 데 도움이 : SQL 서버 : PARTITION BY와 GROUP BY의 차이 그것은 반환 값이 계산되는 방식을 변경하기 때문에 당신은 (어떻게 든) 반환 할 수 없습니다에 의해 열 그룹을 반환 할 수 있기 때문이다.

  6. ==============================

    6.수행하는 같은 것은 내가 최대 같이 집계 함수에 추가 열을 래핑하는 것입니다 (). 중복 값을 기대하지 않을 때 그것은 아주 좋은 작동합니다.

    수행하는 같은 것은 내가 최대 같이 집계 함수에 추가 열을 래핑하는 것입니다 (). 중복 값을 기대하지 않을 때 그것은 아주 좋은 작동합니다.

    Select MAX(cpe.createdon) As MaxDate, cpe.fmgcms_cpeclaimid, MAX(cpe.fmgcms_claimid) As fmgcms_claimid 
    from Filteredfmgcms_claimpaymentestimate cpe
    where cpe.createdon < 'reportstartdate'
    group by cpe.fmgcms_cpeclaimid
    
  7. from https://stackoverflow.com/questions/11991079/select-a-column-in-sql-not-in-group-by by cc-by-sa and MIT license