[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.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.당신은 파티션과 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.직접 대답은 당신이 할 수없는 것입니다. 당신은 집계 또는으로 그룹화되어 뭔가 하나를 선택해야합니다.
직접 대답은 당신이 할 수없는 것입니다. 당신은 집계 또는으로 그룹화되어 뭔가 하나를 선택해야합니다.
그래서, 당신은 다른 접근 방식이 필요합니다.
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.당신은 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.당신이, 선생님을 요구하는 것은 RedFilter의 답변으로 있습니다. 그룹에 의해 어떻게 든 이상 간단한 버전 또는 파티션 왜이 답변뿐만 아니라 이해하는 데 도움이 : SQL 서버 : PARTITION BY와 GROUP BY의 차이 그것은 반환 값이 계산되는 방식을 변경하기 때문에 당신은 (어떻게 든) 반환 할 수 없습니다에 의해 열 그룹을 반환 할 수 있기 때문이다.
당신이, 선생님을 요구하는 것은 RedFilter의 답변으로 있습니다. 그룹에 의해 어떻게 든 이상 간단한 버전 또는 파티션 왜이 답변뿐만 아니라 이해하는 데 도움이 : SQL 서버 : PARTITION BY와 GROUP BY의 차이 그것은 반환 값이 계산되는 방식을 변경하기 때문에 당신은 (어떻게 든) 반환 할 수 없습니다에 의해 열 그룹을 반환 할 수 있기 때문이다.
-
==============================
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
from https://stackoverflow.com/questions/11991079/select-a-column-in-sql-not-in-group-by by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 테이블에서 최대 값을 가지는 오라클 시퀀스 시작을 만드는 방법? (0) | 2020.06.05 |
---|---|
[SQL] 는 SQL Server의 알터 사용자 정의 유형 (0) | 2020.06.05 |
[SQL] 경고 : NULL 값은 아쿠아 데이터 스튜디오에서 집계 또는 다른 SET 연산에 의해 제거 (0) | 2020.06.05 |
[SQL] TSQL가 - A는 ... END 블록을 BEGIN의 방법 GO의 내부를 사용 하는가? (0) | 2020.06.05 |
[SQL] SQL에서 여러 테이블을 조인 (0) | 2020.06.04 |