0
votes

Afficher ne retournez pas les données des 5 derniers jours lorsqu'ils ne sont pas corrects sur la valeur de la clause WHERE

Ceci est une version simplifiée, mais j'essaie de créer une vue qui renvoie les données des 5 derniers jours (y compris aujourd'hui): xxx

Ceci ne renvoie que la valeur actuelle de données .

Lorsque je saisi une date codée dans la clause WHERE (comme indiqué ci-dessous), je renvoie le bon jeu de données correct. Cependant, lorsque je bascule la date codée avec un paramètre que j'attribuais une valeur à la requête externe (comme indiqué dans la requête ci-dessus), il ne renvoie que la date spécifiée dans la clause WHERE (mais pas les 4 derniers jours). < / p> xxx

suis-je oubliant quelque chose?

Merci d'avance.


3 commentaires

Êtes-vous sûr de vous avoir besoin / que vous voulez une vue? Si je pense à vouloir passer un paramètre à une vue et / ou à créer des données dans une vue, j'avais tendance à s'attendre à ce que je serais mieux servi avec une fonction de table pipeline (ce qui pourrait être plus clair aussi bien). C'est une option pour toi?


Oui, une fonction de table pipeline peut également fonctionner. (Je ne sais pas vraiment ce que c'est cependant, haha)


Date dans Oracle est en fait une valeur de date-heure, ce qui signifie que votre fenêtre de sélection est en réalité '2019-04-27 00:00:00' <= t.data_dt <= '2019- 05-01 00:00:00 '. Vous devez utiliser une limite supérieure exclusive - << / code> - pour effectuer la requête en toute sécurité: où t.data_dt> = date'2019-05-01 '- 4 et t.data_dt .


4 Réponses :


1
votes

Que voulez-vous dire "Attribuer un paramètre dans la requête extérieure"? Cela n'a pas de sens. Si vous le souhaitez en tant que "paramètre", vous pouvez utiliser croix rejoindre : xxx


4 commentaires

Désolé, peut-être que je n'aurais pas dû simplifier le problème aussi. Ce que j'essaie essentiellement de faire est de créer une vue qui prend un filtre (ou où la clause) sur le data_dt. Mais lorsque les utilisateurs spécifient la date de la clause WHERE, j'essaie de non seulement ramener les données pour non seulement cette date, mais toutes les données 4 jours précédentes. Cela a-t-il un sens? haha


Il s'agit également d'une «sous-requête» située dans la clause de mon avis. J'essaie de rendre mon avis dynamique en pouvant retourner 5 jours de données lorsque une seule date est spécifiée. Est-ce possible?


Date dans Oracle inclut réellement un composant temporel, de sorte que cela perpétue des erreurs de limites présentes dans l'original. Plus sûr d'utiliser une limite supérieure exclusive.


@ Horlogework-muse. . . L'OP stipule: "Cela ne renvoie que la valeur actuelle des données." Il ne semble pas y avoir de composant temporel sur spécifié_dt .



1
votes

Votre point de vue (requête intérieure dans votre question) ne doit pas avoir de condition de date. Toutes les conditions doivent être dans l'extérieur où code> clause.

Quelque chose comme suit: p> xxx pré>

- mise à jour - forte > p>

Vous pouvez utiliser connecter par niveau code> pour générer 5 lignes totales de 1 rangées, puis la comparer à votre date comme suit: p>

select distinct data_dt -- changed this, try now
from(
     select t.*, t.data_dt - days.lvl + 1 as data_dt_5days
        from table1 t
        Cross Join (select level as lvl from dual connect by level <= 5) days
       WHERE <other_conditions>
     )
where data_dt_5days = date'2019-05-01';


6 commentaires

Ce que j'essaie essentiellement de faire est de créer une vue qui prend un filtre (ou où la clause) sur le data_dt. Mais lorsque les utilisateurs spécifient la date de la clause WHERE, j'essaie de non seulement ramener les données pour non seulement cette date, mais toutes les données 4 jours précédentes.


Il s'agit également d'une «sous-requête» située dans la clause de mon avis. J'essaie de rendre mon avis dynamique en pouvant retourner 5 jours de données lorsque une seule date est spécifiée. Est-ce possible?


Voir la réponse mise à jour maintenant, si c'est ce que vous demandez.


Hmm je ne pense pas que cela fonctionne. Je ne retourne toujours qu'une date


Je pense que vous voudriez que la requête externe soit où data_dt = date'2019-05-01 '; car ce sera le même pour tous les 5 jours


Date dans Oracle inclut réellement un composant temporel, de sorte que cela perpétue des erreurs de limites présentes dans l'original. Plus sûr d'utiliser une limite supérieure exclusive.



1
votes

Si vous créez vraiment une vue, quelque chose comme cela pourrait fonctionner pour vous:

SELECT *
FROM table_view tv
WHERE to_date('01/01/2020', 'MM/DD/YYYY') BETWEEN tv.data_dt AND tv.max_date; --Or whatever date you needed


5 commentaires

Darn, donc il n'y a aucun moyen de le faire dessiner dynamiquement les 5 dates?


@Johnwick Si vous ne cherchez pas vraiment de vue, prenez simplement cette question et laissez-la tomber dans la partie de la requête inférieure.


Je cherche une vue; Cependant, il y aura beaucoup plus de 5 dates de cette table. (~ 500). Ce que je cherche, c'est ce:


Je cherche une vue. Lorsque je spécifie la date (c'est-à-dire 1/5/2019), je souhaite des entrées liées aux 4 derniers jours + cette date (SO 5 jours) Total. Donc, en substance, la requête retournerait des données du 01/01/2019, 01/02/2019, 01/03/2019, 01/04/2019 et 01/05/2019. Cela a-t-il du sens? haha.


Ignorer la question que date dans Oracle a une composante temporelle et que vous utilisez des problèmes liés à cela, vous utilisez une colonne calculée dans une condition de recherche, ce qui peut être coûteux (bien que s'il n'y ait que s'il n'y a que 500 rangées, pas autant d'une question).



1
votes

Vous pouvez être mieux servi avec une fonction de table pipeline plutôt que sur une vue. En particulier si la ou les tableaux sous-jacents à la vue sont relativement complexes, être capable d'écrire explicitement du code pour incorporer des paramètres dans la requête plutôt que d'espérer que l'optimiseur peut pousser le prédicat où il est nécessaire peut être très bénéfique du point de vue de la performance. La table d'échantillons avec données avant et après la fenêtre que vous recherchez p> xxx pré>

Vous aurez besoin d'un type d'objet, d'une collection et d'une fonction de table. p> xxx pré>

Maintenant, vous pouvez interroger votre fonction de table, passer à votre date et obtenir 5 lignes de retour (27 avril au 1er mai) p>

select *
  from last_5_days( date '2019-05-01' );


20 commentaires

Merci beaucoup, je vais revenir en arrière et essayer cela quand je suis de retour près d'un ordinateur. Si cela ne fonctionne pas, je vais simplement ouvrir une autre question. merci encore monsieur!


Je suppose que si je le veux dans une vue, il n'y a pas de méthode plus simple que cela, je suppose?


L'approche de Tejash devrait fonctionner (je crois qu'il y a une faute de frappe dans le clause que j'ai ajouté un commentaire pour). Mais cela peut avoir des problèmes de performance, en particulier si la table est grande ou qu'il existe d'autres prédicats, car l'optimiseur peut ne pas être en mesure de pousser votre prédicat où vous le souhaitez. Une fonction de table me frappe aussi plus simple mais c'est une question d'opinion.


Contrairement au nom du type de données, Date dans Oracle contient réellement un composant temporel, de sorte que vous avez des erreurs de condition limite. Vous devez utiliser une limite supérieure exclusive pour les types de date / heure / horaire / horodatage ( << / code>).


@ Horlorwork-muse - Je reproduit la logique que l'utilisateur spécifié dans la question. Étant donné que l'utilisateur effectue une comparaison sur l'égalité dans la question et obtient des résultats, mon attente est que le composant temporel de cette colonne est toujours minuit et que le entre logique fait ce que l'utilisateur veut.


J'ai essayé de tester la fonction et pour une raison quelconque, lorsque je tente d'utiliser la fonction (sélection de deux), ce qui suit est renvoyé: TBL_OBJ ([T_OBJ], [T_OBJ], [T_OBJ], [T_OBJ], [T_OBJ]) . Savez-vous ce qui peut se passer?


@Johnwick - Je ne suis pas sûr de comprendre ce que vous faites. Vous choisiriez à partir de la fonction comme je l'ai montré de Dual . Il ne serait pas judicieux d'utiliser une fonction de table pipeline dans la liste d'une requête. Si vous l'avez fait, votre extrémité avant n'a probablement aucune idée de la manière d'afficher la collection d'objets qui serait renvoyée.


Oui je sélectionne à partir dual. Cependant, je sélectionne à partir d'Oracle dans l'espace de travail Oracle (n'essayant pas d'afficher des données sur une sorte d'interface utilisateur, haha)


@Johnwick - Ne sélectionnez pas une fonction de table pipeline de Dual. Ne mettez pas une fonction de table pipeline dans la liste d'une requête. Mettez-le dans la clause de . Je suppose que "Oracle Workspace" signifie que vous utilisez l'environnement APEX basé sur le Web comme votre extrémité avant de faire fonctionner les requêtes.


Non Développeur SQL Oracle :). Et désolé - je n'ai pas écouté les directions (mes excuses).


quand j'essaie d'exécuter 'Select * de Last_5_Days (date' 2019-05-01 ');' , je reçois une commande SQL non terminée correctement.


@Johnwick - Si vous exécutez mon exemple exactement comme je l'ai entré, ça marche? En supposant que cela fait, alors quelque chose dans votre version ne s'aligne pas avec ma version. Vous voudrez probablement une question distincte si vous ne pouvez pas déboguer le problème.


Ouais j'ai copié et collé ce que tu avais dans votre réponse, mais je reçois cette erreur. Suis-je pas censé utiliser Oracle SQL Developer?


@Johnwick - Voici un exemple de LIDEQL exécutant ce code qui le montre fonctionnement. LIDEQL.ORACLE.COM/APEX/LIVIVESQL/S/I5XC9DJP1L25JIAPDT3Z3I34A Vous obtenez Toute erreur avant la finale Sélectionnez ?


Non, je ne reçois aucune erreur. C'est étrange cependant, peut-être que Oracle SQL développeur n'aime pas quelque chose? Aurez-vous Oracle SQL Feveloper? J'ai copié et collé et obtenez une commande ORA-00933: la commande SQL n'est pas terminée correctement.


(Je m'excuse BTW)


Bearird, je ne suis pas sûr alors. J'apprécie votre aide! Merci un tas (je crois que j'ai sélectionné votre réponse en tant que meilleure réponse en passant)


@Justincave: Cela a fonctionné: sélectionnez * à partir de la table (last_5_ddays (p_date_dt => date'2019-05-01 ')). Je suppose que nous avons eu une version plus ancienne d'Oracle?


@Johnwick - Quelle version de Oracle utilisez-vous? table n'a pas été nécessaire depuis un moment


11.1 Je crois. haha