2017-12-02 28 views
2

행 수를 사용하여 1 또는 2와 일치하는 값을 반환합니다. 모든 값을 2로 유지해야합니다. 그러나 행 수가 1 인 일부 값은 동일합니다 필터를 시도하는 열 이름에. 내가 찾고있는 건 2의 개수를 가지고 있지만 행 수가 2 인 경우에만 1의 개수를 가진 행을 제외시키는 행을 유지하는 방법입니다. 아래 예제에서 동일한 판매 주문을 528,886의 ID는 있지만 행 2.행 수를 사용하여 중복 값 제거

쿼리가 같은 행을 제외 할 :

select * from (
    select *, ROW_NUMBER() over (partition by SalesOrderPostedID 
    Order By SalesOrderPostedID) as RowNumber 
    from cte5) c 
    Where SalesOrderPostedID=528886 
    and c.RowNumber=1 
    Union all 
    select * from (
    select *, ROW_NUMBER() over (partition by SalesOrderPostedID 
    Order By SalesOrderPostedID) as RowNumber 
    from cte5) c 
    Where SalesOrderPostedID=528886 
    and c.RowNumber=2 

나는 결과를 첨부했다. 약간의 수정과 함께 고르곤에 의해 제공

enter image description here


솔루션. 아래의 쿼리는 카운트가 2 인 모든 행 또는 카운트가 1 인 행을 반환합니다.

선택 하였다. * 에서 (cte5를 선택한다. SalesOrderPostedID하여 파티션 (위에 SalesOrderPostedID 바이 SalesOrderPostedID 의한 주문 (파티션) ROWNUMBER로서 카운트 ()) 위에 , ROW_NUMBER()를 cte5에서 CNT 로서 ) c 여기서 (RowNumber = 2 또는 cnt = 1);

+0

당신은 샘플 데이터 및 원하는 결과를 제공 할 수 있습니까? 나는 그 설명을 정말로 따라갈 수 없다. –

답변

1

왜이 작업을 수행하지 않습니까?

select c.* 
from (select c.*, 
      row_number() over (partition by SalesOrderPostedID 
           Order By SalesOrderPostedID 
           ) as RowNumber 
    from cte5 
    ) c 
where SalesOrderPostedID = 528886 and c.RowNumber <= 2; 

당신이 다음 행의 쌍을 원하는 경우, 다음 사용

select c.* 
from (select c.*, 
      row_number() over (partition by SalesOrderPostedID 
           Order By SalesOrderPostedID 
           ) as RowNumber, 
      count(*) over (partition by SalesOrderPostedID) as cnt 
    from cte5 
    ) c 
where SalesOrderPostedID = 528886 and RowNumber <= 2 and 
     cnt >= 2; 
+0

도움을 주셔서 감사합니다. 이것은 우리가 필요로했던 것입니다. –