Générateur de requêtes - Enregistrements uniques<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Bonjour ,
Après pas mal de lutte personnelle pour résoudre mon problème, j'ai décidé de le poster sous forme de question aux utilisateurs et à la communauté JMP.
Ayez une base de données à partir de laquelle p1, p2, l'actif et le temps sont extraits. La base de données est une base de données qui s'accumule, ce qui signifie que les paramètres p1 et p2 sont chargés comme représentant le dernier état de chaque actif à un moment précis temps . En d'autres termes, les anciennes instances antérieures de p1 et p2 ne sont pas valides, et les versions les plus récentes de p1 et p2 sont nécessaires pour un actif au plus tard signalé temps .
Par conséquent, ce dont j'ai besoin est un ordre décroissant via temps puis forcer le résultat à être unique à actif niveau.
Des idées sur la façon dont j'ai besoin de diriger cela dans le générateur de requêtes?
Je préfère plutôt avoir une solution en n'utilisant pas de SQL personnalisé.... J'ai en fait une solution chez Custom SQL mais j'aime apprendre à le faire dans le générateur de requêtes car j'ajouterai quelques éléments supplémentaires qui seront difficiles à faire dans le Custom SQL
Appréciez l'aide.
Altug Bayram
Re : Générateur de requêtes - Enregistrements uniquesCeci est un vieux post, mais voici:
@altug_bayram écrit:
j'ai oublié de rajouter...
La raison pour laquelle je ne pouvais pas faire fonctionner votre requête à l'origine est que je ne faisais pas référence à la base de données de la bonne manière. Une fois que nous avons fait cela, cela a fonctionné
Quelle était la bonne manière ? J'obtiens également une erreur indiquant "ERREUR : la relation "databases_enzyme_db" n'existe pas ; Erreur lors de la préparation des paramètres [SQLSTATE=42P01]" et je ne sais pas comment résoudre ce problème
Re : Générateur de requêtes - Enregistrements uniquesAvec plaisir.Ce fil a vraiment poussé ma compréhension des sous-requêtes.J'ai beaucoup appris.
Prends soin de toi,
Éric
Re : Générateur de requêtes - Enregistrements uniquesÉric,
Je comprends mieux maintenant et je suis d'accord avec toi. Encore une fois, merci pour l'effort que vous avez fourni à ce problème.
Votre aide a été très précieuse.
Re : Générateur de requêtes - Enregistrements uniquesL'exécution de la version d'origine avec uniquement Time et l'utilisation de l'agrégation MAX sur X peut permettre de renvoyer les lignes correctes, mais vous ne pourrez pas connaître les valeurs de p1 et p2 pour ces lignes.Si je fais ce que vous avez dit en laissant p1 et p2 dans la requête, j'obtiens toutes les lignes avec les durées maximales en double, car p1 et p2 deviennent GROUP BY pour la requête :

Maintenant, si je retire p1 et p2 de la requête, la requête renvoie les lignes correctes :

mais le but était de trouver les valeurs de p1 et p2 pour ces lignes, et elles ont disparu.Je pense donc que l'approche de la double sous-requête est la seule approche qui répond à la question que vous avez posée.
Éric
Re : Générateur de requêtes - Enregistrements uniquesÉric,
Ça a marché comme sur des roulettes ...
Je me demande cependant ... cela aurait-il également fonctionné en exécutant la première version originale d'epxression personnalisée (avec uniquement Time) ET en choisissant l'agrégation X comme "Maximum" dans le champ "Colonnes incluses" ...?
Merci beaucoup ....
Re : Générateur de requêtes - Enregistrements uniquesDISTINCT n'aidera pas l'OP, car il n'y a vraiment pas de lignes distinctes ici.
J'ai trouvé une requête qui résoudrait le deuxième cas.J'ai ajouté 6 lignes en bas qui dupliquent les temps maximum pour chaque actif, plus ajouté une variable X.Voici le tableau :

Et voici la requête qui fonctionne (elle nécessite une sous-requête et une sous-requête dans une sous-requête) :

L'expression personnalisée est :
t1.Time = (SELECT MAX(tInner.Time) FROM parts tInner WHERE t1.Asset = tInner.Asset)
ET
t1.X = (SELECT MAX(tInner.X) FROM parts tInner WHERE t1.Asset = tInner.Asset AND
tInner.Time = (SELECT MAX(tInner2.Time) FROM parts tInner2 WHERE tInner.Asset = tInner2.Asset))
J'ai mis en majuscule tous les mots-clés SQL pour faciliter la lecture.J'ai essayé quelques requêtes plus simples, mais elles n'ont pas fonctionné.
HTH,
Éric
Re : Générateur de requêtes - Enregistrements uniquesS'il s'agit d'une entrée en double, l'utilisation du mot-clé DISTINCT peut aider.
Re : Générateur de requêtes - Enregistrements uniquesj'ai oublié de rajouter...
La raison pour laquelle je ne pouvais pas faire fonctionner votre requête à l'origine est que je ne faisais pas référence à la base de données de la bonne manière. Une fois que nous avons fait cela, cela a fonctionné
Re : Générateur de requêtes - Enregistrements uniquesÉric,
Merci beaucoup ....
Désolé, j'ai mis du temps à comprendre avec une autre personne compétente en matière de requêtes chez GE.
Votre solution (la première) a définitivement fonctionné !!! Je n'ai pas encore essayé le second.
J'ai un autre problème -
il s'avère que les personnes qui remplissent la base de données ont inséré une entrée en double pour quelques actifs au même moment chronologique. Donc, pour contourner le problème, j'ai une autre colonne intitulée say X . Manuellement, je choisirais simplement les deux avec le plus grand X. Je ne voulais pas convertir de Max(Time) en Max(X) car X en soi n'est peut-être pas aussi fiable, mais serait le facteur de sélection pour les entrées de temps en double.
Nous avons essayé de convertir votre expression personnalisée d'origine pour en quelque sorte inclure un deuxième MAX (sur X) ... mais cela n'a pas fonctionné ...
Donc .. essayer de tirer chaque actif où le temps est MAX et si plusieurs entrées sélectionnent l'entrée avec Max (X)
Aucune suggestion
Re : Générateur de requêtes - Enregistrements uniquesMon exemple original était pour SQL Server, qui est un peu plus indulgent.Pour Oracle, j'ai dû formater le nom de la table dans la sous-requête en tant que schema.table, et j'ai dû citer mes noms à casse mixte :
t1."Heure" = (sélectionnez MAX(t2."Heure") dans SQBTEST. "pièces" t2 où t2."Actif" = t1."Actif")
Essayez de changer ma table lors de votre première tentative de .my_table et voir si cela aide.
Éric
Re : Générateur de requêtes - Enregistrements uniquesHé, altug,
Quelle base de données utilisez-vous ?
Seriez-vous prêt à partager le SQL de votre requête SQL personnalisée qui vous donne le résultat que vous recherchez ?
Merci,
Éric
Re : Générateur de requêtes - Enregistrements uniquesBonjour Éric,
Tout d'abord merci pour votre aide....
Votre compréhension est correcte. J'essaie simplement de tirer une seule ligne pour chaque actif où Time est max (ou le plus récent).
J'ai appliqué vos formules. Cependant, cela me donne une erreur.
Je l'ai d'abord appliqué comme vrai nom de table, puis comme "t1"
t1.calendar_month = (sélectionnez MAX(calendar_month) dans my_table t2 où t1.engine_serial_num = t2.engine_serial_num)
t1.calendar_month = (sélectionnez MAX(calendar_month) de t1 t2 où t1.engine_serial_num = t2.engine_serial_num)
ERREUR : la relation "ma_table" n'existe pas.
ERREUR lors de l'exécution de la requête [ SQLSTATE: 42P01 ]
Re : Générateur de requêtes - Enregistrements uniquesHé, altug,
Voici un tableau qui, je crois, ressemble à ce que vous décrivez (mais supposez qu'il se trouve dans une base de données plutôt que dans JMP):

Si j'ai bien compris, vous souhaitez récupérer une ligne pour A1, A2, A3 et A4 pour laquelle Time est le maximum.Est-ce exact?
Je ne crois pas que ce soit possible sans faire une sous-requête qui utilise la fonction MAX, ce que vous pouvez faire en utilisant un filtre d'expression personnalisée.Voici la requête avec laquelle j'ai fini:

Si c'est trop petit pour être lu, l'expression personnalisée est :
t1.Time = (sélectionnez MAX(Time) dans les parties t2 où t1.Asset = t2.Asset)
Vous transmettez donc la valeur de Asset à partir de la requête principale (t1.Asset) et sélectionnez les lignes qui ont la valeur Time maximale pour cet actif.
Dis moi si ça aide.
Éric
Re : Générateur de requêtes - Enregistrements uniquesFacture
Merci pour la réponse rapide.
Cependant, à moins qu'il ne me manque une chose critique ici, cela ne résout pas mon problème.
1) Le dernier point valide d'un actif n'est généralement pas au même moment, ils sont assez différents. Ils peuvent avoir des années de différence.
2) Je ne cherche pas une solution rapide si possible. J'ai besoin que ce soit entièrement automatisé.
3) Je ne sais vraiment pas comment "Filtrer par" avec >= peut le rendre unique non plus. Je pense que vous vouliez plutôt filtrer par "="
J'ai donc besoin d'une approche qui récupère la dernière entrée chronologique pour n'importe quel actif sans avoir à spécifier de filtre temporel (car les dernières données peuvent être n'importe où dans le temps).
Merci.
Re : Générateur de requêtes - Enregistrements uniquesSalut Altug,
Veuillez consulter l'image ci-dessous pour obtenir un ordre décroissant de temps.
Faites un clic droit sur votre variable de temps dans les colonnes disponibles et sélectionnez "Trier par". Une nouvelle boîte de dialogue apparaîtra en bas à droite.De là, vous pouvez choisir la flèche descendante pour obtenir l'ordre de temps souhaité.
Vous pouvez ensuite utiliser un filtre avec une invite pour sélectionner un niveau d'actif unique.
