0
votes

Max Dernière valeur null SQL

Je rencontre le problème suivant. J'ai une table dans ce tableau I de la même histoire. En raison d'une erreur, je suis intéressé à trouver les informations suivantes.

Le dernier enregistrement d'un utilisateur où la valeur de Colonne1 est NULL et la date de modification est la dernière pour cet utilisateur. Le problème est que le tableau contient plus d'enregistrements dans lesquels le modifié n'est pas null pour cet utilisateur et muté après la date que je recherche.

Peut-être que quelqu'un veuille me signaler dans la bonne direction? < p> échantillon de données: xxx

Donc, pour cet utilisateur, je ne suis pas intéressé par un enregistrement et doit être exclu du résultat car la modification sur DateTime devrait être avant 29- 10 et avant cette date, la valeur freefield01 doit être nulle et modifiée doit être la dernière.


6 commentaires

Quelle base de données utilisez-vous?


Veuillez fournir un échantillon de données ainsi que des résultats attendus et la requête que vous avez essayée ...


S'il vous plaît voir ma mise à jour


Alors quel produit DBMS est vous utilisez?


Mec, veuillez fournir votre résultat attendu en fonction de votre échantillon ci-dessus!


@Gosfly: Pour les données d'échantillonnage, le résultat attendu est vide. Op l'a déjà dit. La dernière rangée de la personne ne correspond pas à la condition "avant le 29 octobre et la valeur est null".


4 Réponses :


0
votes

Vous pouvez utiliser ce script ci-dessous- xxx

Démo ici


9 commentaires

Pourriez-vous s'il vous plaît voir mon poste mis à jour, j'ai ajouté des informations


Quelle base de données utilisez-vous?


J'utilise MSSQL


S'il vous plaît vérifier mon script mis à jour. Il devrait fonctionner pour vous.


Merci pour votre aide. Alors j'ai dirigé la requête et j'ai eu des résultats. Par exemple celui-ci. Mais ce résultat devrait être exclu car le dernier résultat avant 29-10 n'est pas null. Événement PersonID Freefield01 freefield03 freefield03 freefield03 freefield05 freef ield06 freefield07 f Réfield07 Frefield08 modifiedo n userid archive inséré 9 0006417 null null null null null null 18-10-2019 13:35:54 6 0 Mise à jour 9 null null null NULL NULL NULL NULL NULL NULL 20-10-2019 17:07:23 6 0 Mise à jour 9 0006417 NULL NULL NULL NULL NULL NULL NULL 23-10-2 019 21:04:42 6 0


Vérifiez le résultat dans Demo Link fourni.


@mkrabbani: Je pense que vous avez mal compris la demande. L'OP n'est pas intéressé par la dernière ligne NULL avant le 29 octobre. Ils souhaitent savoir si la dernière ligne est NULL et avant le 29 octobre.


Haha, vous pouvez aussi bien avoir utilisé votre requête précédente et simplement déplacer les conditions à la date et à la valeur null en dehors de la sous-requête :-)


BTW: Soyez prudent lorsque vous comparez des dates avec des chaînes. Les SGBD peuvent ne pas être en mesure de deviner correctement quelle date '30 -10-2019 'est censée être. Meilleur travail avec les variables de date Date '2019-10-30' Si possible. SQL Server ne connaît pas la date littéraux. Il est recommandé d'utiliser une chaîne dans le format 'yyyy-mm-dd' dans ce SGMS (c'est-à-dire identique à une date standard littéral sans le mot clé date ).



0
votes

Trois conditions:

  1. Il n'y a pas d'entrée plus récente pour la personne.
  2. La valeur d'entrée est NULL.
  3. La date est avant 2019-10-29.

    La requête: xxx


4 commentaires

Merci de votre aide. Je pense avoir trois conditions, la date de modification doit être avant 29-10, le freefield01 doit être null et pour cette personne, il doit s'agir de la dernière date de modification. Quand j'exécute votre requête, j'ai trois résultats et il doit y avoir plus.


Alors veuillez vérifier vos données. Supprimez les conditions NULL et DATE (2e et 3ème condition) de la requête. Ainsi, vous voyez la dernière ligne de chaque personne. Vérifiez leur date et leur valeur.


sa rendant mon esprit tourne. Ne peut pas comprendre quel est le problème.


Vous dites que vous attendez plus de lignes de résultat. Y a-t-il une personne particulière que vous attendez dans les résultats, mais ce n'est pas là? Sélectionnez ensuite les lignes de la personne commandées par date. Regardez la dernière ligne. Est-ce vraiment une ligne avant le 29 octobre avec une valeur null?



-1
votes

La requête la plus simple que j'ai trouvée pourrait être la suivante si je comprends bien votre demande: xxx pré>

Voir exemple ici strong> p>

Edit: Suivant ci-dessous des suggestions, vous pouvez utiliser cette requête à la place: P>

SELECT t1.personid, t1.FreeField01, t1.ModifiedOn
FROM test t1
JOIN (
    SELECT t.personid, MAX(ModifiedOn) AS MaxModifiedOn FROM test t
    GROUP BY personid
    HAVING MAX(ModifiedOn) < STR_TO_DATE('29-10-2019','%d-%m-%Y')
) t2 ON (t1.personid = t2.personid AND t1.ModifiedOn = t2.MaxModifiedOn)
WHERE FreeField01 IS NULL


10 commentaires

Ceci est invalide SQL. Vous regroupant par personnage , mais accès freefield01 dans la clause comme s'il existait un seul freefield01 Valeur par personne. Le seul SGBD que je connaisse de cela, vous allons écrire de telles questions est MySQL. Il applique silencieusement any_value sur freefield01 alors, c'est-à-dire choisi arbitrairement une des valeurs de la personne, peu importe à partir de quelle ligne. Meilleur jeu uniquement_full_group_by Mode, tant que vous avez des problèmes avec agrégation, MySQL vous empêche d'écrire ces requêtes non valides.


Et s'il vous plaît n'écrivez pas max (modifiedon) <'29 -10-2019 '. Vous comparez une date d'heure avec une chaîne. Ne fais pas ça. Cela oblige MySQL à essayer de convertir votre chaîne à une date. Cela peut ou non fonctionner en fonction des paramètres de la base de données. L'expression appropriée avec une date littéral serait max (modifiedon) .


Oui, cela devrait fonctionner. Votre nouvelle requête est égale à la requête Mkrabbani posté il y a une heure.


@Gosfly Cela me donne le même résultat que la requête que Thorsten fournie. Je reçois 3 rangées., Si je retire la condition de date, je reçois 3 de retour.


@ user2633207: qui prouve que les requêtes fonctionnent :-) Si vous attendez plus de lignes dans les résultats, vous souhaitez évidemment que d'autres critères appliqués. Lequel? Fournissez un exemple avec des données dans lesquelles vous vous attendez à une personne du résultat et ce n'est pas là.


Tout d'abord, merci pour votre aide (tous). Il est donc possible qu'il y ait une personne X qui a une valeur nulle sur 21-10 et un 12345 sur 26-10. Je ne veux pas cet utilisateur dans les résultats. Je veux seulement voir des utilisateurs qui avaient une nulle 28-10 et il est possible qu'ils disposent d'un 12345 maintenant, c'est bien (et attendu). Edit: ou une null avant 28-10 et rien après.


@ user2633207: c'est différent. Donc, vous voulez regarder la dernière ligne avant le 29 octobre. Si cette dernière ligne a une valeur nulle, vous voulez le montrer. C'est ce que fait la requête de Gordon. Alors qu'est-ce qui ne va pas avec sa requête alors? (Et pourquoi ne me dis-tu pas tout de suite que la première condition que je mentionne dans ma réponse est fausse?)


Le problème est que cela ne montre pas le résultat attendu. Je sais à coup sûr qu'il doit y avoir plus.


Sélectionnez T. * à partir de VWPersonFreeFieldhist comme T Où T.Modifiedon = (Sélectionnez Max (T2.Modifiedon) de VWPersonFreeFieldhist T2 où T2.Personid = T.Personid et T2.Modifiedon <= '2019-10-29') et T.freefield01 est null; Si je courais cela, je reçois ce personnage1 dans les résultats afin que cela ne soit pas mal.


Laissez-nous Continuer cette discussion en chat .



0
votes

Si je comprends correctement, vous recherchez des personnes où le freefield01 code> a une valeur de null code> à partir d'une certaine date.

Voici une méthode: xxx pré>

edit: p>

basé sur votre commentaire, vous pouvez simplement vouloir une agrégation et avoir code>: p>

select personid
from t
where t.ModifiedOn <= '2019-10-29'
group by person_id
having sum(case when t.FreeField01 is null then 1 else 0 end) = 0


1 commentaires

Vous comprenez correct. Mais il ne peut pas y avoir un enregistrement après l'enregistrement NULL. Donc, s'il existe un enregistrement NULL pour freefield01 sur 21-10 et il y a un enregistrement avec une valeur dans freefield01 sur 27-10, je ne suis pas intéressé par cet utilisateur.