J'essaie de créer une requête pour obtenir les données uniques de la base de données, mais ici, le problème auquel je suis confronté est que certains enregistrements ont plusieurs enregistrements et que ces enregistrements ont des valeurs nulles et non nulles .. Je dois choisir la valeur de l'enregistrement qui a la dernière date de création et ses données sont nulles. Mais j'obtiens les données pour lesquelles le dernier enregistrement n'a pas de valeurs nulles ..

Par exemple: j'ai un enregistrement qui a 3 enregistrements avec la date en mois de février, septembre et mois d'oct .. J'ai créé une requête pour obtenir le dernier enregistrement basé sur la condition max mais lorsque j'utilise la condition where pour obtenir la valeur nulle records .. Il prend le record de février .. Comment puis-je arrêter d'obtenir la valeur d'un record qui n'est pas le plus récent.

Exemple de requête:

Select * from ( select col1,date, col3, max(date),count(col1) from table group by col1,date,col3 having count(col1) <=1) where col3 is null

Ici, je m'attends à ce qu'il filtre les enregistrements qui ont les derniers enregistrements, mais cela ne se produit pas car ici un enregistrement a null et un enregistrement n'est pas nul .. Alors, comment surmonter cela

-2
Satish Rongala 28 oct. 2020 à 15:42

3 réponses

Meilleure réponse

Votre requête peut ne pas s'exécuter telle quelle. Vous devez donner un nom à votre sous-requête et également dans une sous-sélection, vous devez donner un nom à vos champs dérivés, par exemple count(a) a besoin d'un nom, par exemple count_a. Voir mon SQL modifié ci-dessous. J'ai testé ce code et il fonctionne. J'ai seulement ajouté x comme nom pour ma sous-requête et j'ai nommé les champs de somme as Party_Address_Start_Dt et as Count_Address_Id

SELECT *
FROM   (SELECT Address_Id,
               Party_Role_Cd,
               Address_Close_Reason_Cd,
               MAX(Party_Address_Start_Dt) AS Party_Address_Start_Dt,
               COUNT(Address_Id)           AS Count_Address_Id
        FROM   party_address_hist
        GROUP  BY Address_Id,
                  Party_Role_Cd,
                  Address_Close_Reason_Cd
        HAVING COUNT(Address_Id) <= 1) x
WHERE  Address_Close_Reason_Cd IS NULL 
0
Dharman 28 oct. 2020 à 20:06

Il est préférable d'utiliser QUALIFY ROW_NUMBER () que d'utiliser QUALIFY RANK () car le numéro de ligne donne des valeurs uniques tandis que row_number affichera toujours des lignes en double

0
Margaretha Du Toit 28 oct. 2020 à 13:41

Vous pouvez utiliser row_number():

select t.*
from (select t.*,
             row_number() over (partition by col1 order by date desc) as seqnum
      from t
     ) t
where seqnum = 1 and col3 is null;

Je suppose que vous voulez une ligne par valeur col1.

Le row_number() énumère toutes les lignes, avec 1 pour la dernière. Le where obtient alors ceux où col3 est null.

0
Gordon Linoff 28 oct. 2020 à 12:45