web-dev-qa-db-ja.com

パーティションで複数の列を使用し、重複する行が返されないようにする方法

SQLのPartition Byステートメントで複数の列を使用しましたが、重複した行が返されます。個別の行のみが返されるようにしたい。

これは、Partition Byでコーディングしたものです。

SELECT DATE, STATUS, TITLE, ROW_NUMBER() OVER (PARTITION BY DATE, STATUS, TITLE ORDER BY QUANTITY ASC) AS Row_Num
    FROM TABLE

これは私が現在取得している出力です:(duplicate行が返される場所-行6を参照してください8

enter image description here

これは私が達成したい出力です:(重複なし行が返されます-行6から8を参照してください

enter image description here

質問複数の列1 Partition Byand EnsureNo DuplicateRow is Returned?

誰かがこれについて助けてくれることを感謝します、ありがとうございます!!

14
Felicia Soh

これを試して、それは私のために働いた

SELECT * FROM (
            SELECT
                [Code],
                [Name],
                [CategoryCode],
                [CreatedDate],
                [ModifiedDate],
                [CreatedBy],
                [ModifiedBy],
                [IsActive],
                ROW_NUMBER() OVER(PARTITION BY [Code],[Name],[CategoryCode] ORDER BY ID DESC) rownumber
            FROM MasterTable
          ) a
        WHERE rownumber = 1 
7
Ankit Raonka

テーブルの列に重複データが含まれていて、row_number()を直接適用して列にP​​ARTITIONを作成すると、行が重複し、行番号の値が含まれる可能性があります。

重複する行を削除するには、from句にINNERクエリがもう1つ必要です。これにより、重複する行が削除され、PARTITIONとROW_NUMBER()を適用できる最も重要な外側のFROM句に出力が提供されます。

以下の例のように:

SELECT DATE, STATUS, TITLE, ROW_NUMBER() OVER (PARTITION BY DATE, STATUS, TITLE ORDER BY QUANTITY ASC) AS Row_Num
FROM (
     SELECT DISTINCT <column names>...
) AS tbl
5
Bhavesh Harsora

Cteを作成し、内部結合を行います。効率的ではありませんが、便利です

with table as (
SELECT DATE, STATUS, TITLE, ROW_NUMBER() 
OVER (PARTITION BY DATE, STATUS,  TITLE ORDER BY QUANTITY ASC) AS Row_Num
 FROM TABLE)

select *

from table t
join select(
max(Row_Num) as Row_Num
,DATE
,STATUS
,TITLE
from table 
group by date, status, title) t2  
on t2.Row_Num = t.Row_Num and t2
and t2.date = t.date`enter code here`
and t2.title = t.title
0
Andrew Troiano