0
votes

Query SQL Comparant les rangées à l'intérieur de la table (Oracle DB)

dans un dB oracle, j'ai une table avec du contenu similaire à celui-ci: xxx

J'ai besoin d'une requête SQL qui retournerait la première occurrence de chaque changement de la date d'introduction du marché (marquée * À la fin) avec la date de changement et l'auteur.

Donc, le résultat de la requête sera: xxx

merci d'avance < / p>


6 commentaires

Pourquoi avez-vous marqué 2 rangées avec "01.01.2025" et Peterson? On dirait que 01.01.2025 15.04.2020 Peterson devrait être 01.07.2025 30.09.2019 Smith


On dirait que les deux rangées de Peterson devraient être là; Mais le 01.07.2025 / 30.09.2019 / Smith doit également être inclus (et être marqué d'un astérisque), ou était-ce que cette date est censée être 2024?


@Sayanmalakshinov: d'intérêt n'est pas lorsque chaque date d'introduction du marché a été définie, mais lorsque les modifications se sont produites.


@Alexpoole: C'était une erreur. Je l'ai corrigé. Merci pour le conseil!


Alors Peterson ne devrait donc pas apparaître deux fois, mais Smith devrait? C'est ce que la première requête de ma réponse fait; Mais pourquoi Peterson (seulement) contre 15.04.2025 plutôt que 10.10.2024 dans votre production; qui ne correspond pas aux astérisques maintenant incidemment. Je suis encore moins sûr de ce que vous voulez réellement.


@llasarov ok, je vois, on dirait que "début du groupe" standard, merci, j'ai mis à jour ma réponse avec match_recognize


4 Réponses :


0
votes

Quelque chose comme ça devrait fonctionner: xxx


2 commentaires

Je pense que les astérisques ont été ajoutés aux données de la question pour mettre en évidence ces lignes plutôt que d'être réellement dans la table. Pas tout à fait clair cependant ... mais s'ils sont là, le nombre ou les espaces varie.


J'ai utilisé l'astérisque pour marquer les entrées pour la sortie. Mais en plus de la solution est brillante ;-)



1
votes

Vous pouvez utiliser l'agrégation, avec le garder ... Premier code> Extension: xxx pré>

En savoir plus . P>

J'ai raté que l'une des dates est répétée, donc c'est un problème de lacunes et de îles. tabibitosan à la rescousse: p>

select Market_Intro_Date,
  min(Change_Date) as Change_Date,
  min(Author) keep (dense_rank first order by Change_Date) as Author
from (
  select Market_Intro_Date, Change_Date, Author,
    row_number() over (partition by Market_Intro_Date order by Change_Date)
      - row_number() over (order by Change_Date) as grp
  from your_table
)
group by Market_Intro_Date, grp
order by Change_Date desc;

MARKET_INTRO_DATE | CHANGE_DATE | AUTHOR  
:---------------- | :---------- | :-------
01-JUN-25         | 10-JUL-20   | Meyer   
01-JAN-25         | 15-APR-20   | Peterson
01-DEC-24         | 15-JAN-20   | George  
01-JAN-25         | 10-OCT-19   | Peterson
01-JUL-25         | 30-SEP-19   | Smith   
01-JUL-24         | 01-MAY-19   | Smith   


0 commentaires

0
votes

Vous pouvez utiliser n'existe pas comme suit: xxx


0 commentaires

1
votes

mis à jour après la clarification forte> em>

Match_Recognize fonctionne généralement plus vite que la vieille solution start_of_group basée sur les fonctions analytiques: p>

CHANGE_DATE         MARKET_INTRO_DATE   AUTHOR
------------------- ------------------- --------
2019-05-01 00:00:00 2024-07-01 00:00:00 Smith
2019-09-30 00:00:00 2025-07-01 00:00:00 Smith
2019-10-10 00:00:00 2025-01-01 00:00:00 Peterson
2020-01-15 00:00:00 2024-12-01 00:00:00 George
2020-04-15 00:00:00 2025-01-01 00:00:00 Peterson
2020-07-10 00:00:00 2025-06-01 00:00:00 Meyer


0 commentaires