2017-12-02 5 views
2

行カウントを使用して1または2のいずれかと一致する値を返します。すべての値を2にする必要があります。ただし、行数が1の値の一部は、列名にフィルターをかけようとしています。私が探しているのは、2のカウントを持つ行を保持するメソッドですが、行数2の場合にのみ1のカウントで行を除外します。以下の例では、 528886の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


ソリューション。以下のクエリは、1または2の行を返します。

を選択し、C。* から(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

ありがとうございます。これは私たちが必要としていたものでした。 –

関連する問題