0
votes

Sélectionnez l'instruction en utilisant Group-by tout en ignorant la colonne sur PostgreSQL

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


0 commentaires

3 Réponses :


0
votes

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


2 commentaires

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



1
votes

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')
  ;


6 commentaires

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.



0
votes

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;


2 commentaires

Cela donnera également du C 2 en sortie. ce qui n'est pas obligatoire


ajout d'une deuxième variante