web-dev-qa-db-fra.com

Comment utiliser plusieurs colonnes dans une partition et s'assurer que ligne en double n'est renvoyée

J'ai utilisé plusieurs colonnes dans l'instruction Partition By by dans SQL, mais les lignes en double sont renvoyées. Je veux seulement que des lignes distinctes soient renvoyées.

C'est ce que j'ai codé dans Partition By:

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

C'est la sortie que je reçois actuellement: (Où il y a duplicate lignes retournées - Veuillez vous référer aux lignes 6 à 8 )

 enter image description here

Voici le résultat que je souhaite obtenir: ( pas de doublon ligne renvoyée - veuillez vous reporter aux lignes 6 à 8 )

 enter image description here

Question : Comment puis-je placer plusieurs colonnes in 1 Partition By et Ensure No Duplicate La ligne est renvoyée?

Appréciez si quelqu'un peut me fournir de l'aide à ce sujet, merci beaucoup !!

3
Felicia Soh

Si vos colonnes de table contiennent des données en double et si vous appliquez directement row_ number () et créez PARTITION sur une colonne, vous risquez d'obtenir une ligne dupliquée et une valeur de numéro de ligne.

Pour supprimer les lignes en double, vous avez besoin d'une autre requête INNER dans la clause from, qui élimine les lignes en double. Elle produira ensuite la sortie vers la clause FROM la plus externe, où vous pouvez appliquer PARTITION et ROW_NUMBER ().

Comme exemple ci-dessous:

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
2
Bhavesh Harsora

Essayez ceci, Cela a fonctionné pour moi

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 
1
Ankit Raonka

Je créerais un cte et ferais une jointure interne. Ce n'est pas efficace mais c'est pratique 

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