J'ai un nom de table "rapport" dans Postgresql db comme:
student class C 1 D 1 D 2
Je veux obtenir toutes les lignes du tableau ci-dessus pour lesquelles les notes étaient toujours NAN (indépendamment de observation_time) pour un élève et une classe particuliers.
Le résultat attendu est:
Student Class Marks Observation_time A 1 11 21/7/2020 A 2 13 18/7/2020 B 1 19 17/7/2020 A 1 17 15/7/2020 B 1 15 21/7/2020 C 1 NAN 10/7/2015 C 1 NAN 11/7/2015 C 2 8 10/7/2015 C 2 0 11/7/2015 D 1 NAN 10/7/2015 D 1 NAN 11/7/2015 D 2 NAN 10/7/2015 D 2 NAN 11/7/2015
Quelqu'un pourrait-il m'aider s'il vous plaît avec la requête? Merci
3 Réponses :
Consultez la documentation sur GROUP BY, c'est très puissant mais cela peut aussi être assez délicat. La réponse précédente (DISTINCT) est en fait également une sorte de GROUP BY. Je pense que cela devrait vous donner le résultat que vous recherchez, mais veuillez lire la documentation afin de comprendre ce qui se passe.
Select MIN(Student), MIN(Class) from report where Marks = 0 group by Student, Class
Cela donnera également du C 2 en sortie. ce qui n'est pas obligatoire.
essayez de supprimer la classe du groupe par, veuillez lire la documentation sur GROUP BY
J'ai créé un exemple pour votre question.
Student Class C 1 D 1 D 2
with CTE_select as ( select ISNULL(Marks,0) Marks, Student,Class from reportt ) select Student,Class,SUM(Marks) from CTE_select where marks >= 0 group by Class,Student having SUM(Marks)= 0;
résultat =
CREATE TABLE reportt ( Class int, Marks int, Student VARCHAR(100), Observation_time VARCHAR(100), ); INSERT INTO reportt (Student, Class, Marks,Observation_time) VALUES ('A',1,11,'21/7/2020'), ('A',2,13,'18/7/2020'), ('B',1,19,'17/7/2020'), ('A',1,17,'15/7/2020'), ('B',1,15,'21/7/2020'), ('C',1,null,'10/7/2015'), ('C',1,null,'11/7/2015'), ('C',2,8,'10/7/2015'), ('C',2,0,'11/7/2015'), ('D',1,null,'10/7/2015'), ('D',1,null,'11/7/2015'), ('D',2,null,'10/7/2015'), ('D',2,null,'11/7/2015') ;
Désolé, je n'ai pas précisé dans la question mais les notes peuvent également être négatives.
vous voulez donc que les notes soient à la fois nulles ou négatives?
Non seulement des zéros. Je veux une paire d'élève et de classe où il a toujours été signalé comme 0
@hosseinzakizadeh. . . L'expression correcte serait quelque chose comme having min(marks) = 0 and max(marks) = 0
.
Désolé pour ça. Mais au fur et à mesure que je traite mes données, mes exigences ont changé. Pourriez-vous s'il vous plaît regarder le code modifié s'il vous plaît?
hi.ok. Je vais.
si vous voulez trouver toutes les lignes avec NULL dans Marks, utilisez:
SELECT Student,Class FROM report GROUP BY Student,Class HAVING COUNT(*)=COUNT(*)FILTER(WHERE Marks IS NULL)
..l'opérateur DISTINCT supprime les doublons du résultat
une autre variante est:
SELECT DISTINCT Student,Class FROM report WHERE Marks IS NULL;
Cela donnera également du C 2 en sortie. ce qui n'est pas obligatoire
ajout d'une deuxième variante