J'ai une table de données comme celle-ci:

dept   sub-dept   class   submission-date
 ENG      CS        A       12-06-2012    
 ENG      CS        A       19-08-2012
 ENG      EE        A       02-04-2012
 ENG      CS        A       12-08-2013
 ENG      EE        A       02-06-2012
 SCI      PHY       B       11-04-2012

Le résultat doit ressembler à ceci:

dept   sub-dept   class     count    started-date   last-date
 ENG      CS        A         2       12-06-2012    19-08-2012
 ENG      EE        A         2       02-04-2012    02-06-2012
 ENG      CS        A         1       02-04-2013    02-04-2013
 SCI      PHY       B         1       11-04-2012    11-04-2012

Dans la première ligne (ENG, CS, A), la date de soumission est le 12-06-2012, je veux donc savoir combien de lignes y a-t-il avec la même combinaison que ENG, CS, A dans le 12-06-2012 et 12- 06-2013 (La date de soumission du premier événement doit être considérée comme la date initiale). Bien que la 4ème ligne ait la même combinaison mais ne se situe pas dans une année à partir de la première occurrence, elle doit donc être représentée séparément (ne doit pas être incluse dans le décompte). la date de début et la dernière date sont la première et la dernière occurrence des combinaisons dans l'année suivant les premières occurrences. Je fais cela dans MySQL (version -5.6). Pour ce problème, une requête mysql de base ou même une procédure stockée peuvent être utilisées. Merci d'avance.

0
vaibhav 20 avril 2020 à 11:31

2 réponses

Meilleure réponse
CREATE TEMPORARY TABLE datasource (
  dept   CHAR(3),
  subdept   char(3),
  class   CHAR(1),
  submissiondate DATE
);

INSERT INTO DataSource (dept, subdept, class, submissiondate)
    VALUES ('ENG','CS','A','12-06-2012'),    
           ('ENG','CS','A','20120819'), -- MAKE Way for MDY format in database
           ('ENG','EE','A','02-04-2012'),
           ('ENG','CS','A','12-08-2013'),
           ('ENG','EE','A','02-06-2012'),
           ('SCI','PHY','B','11-04-2012');

Requête

SELECT dept, subdept,c lass, COUNT(*) as cnt,
       MIN(Submissiondate) as started_date,
       MAX(Submissiondate) as last_date
FROM @DataSource
GROUP BY dept, subdept, class, YEAR(SubmissionDate)

Ensemble de résultats

+------+---------+-------+-----+--------------+------------+
| dept | subdept | class | cnt | started-date | last-date  |
+------+---------+-------+-----+--------------+------------+
| ENG  | CS      | A     |   2 | 2012-08-19   | 2012-12-06 |
| ENG  | CS      | A     |   1 | 2013-12-08   | 2013-12-08 |
| ENG  | EE      | A     |   2 | 2012-02-04   | 2012-02-06 |
| SCI  | PHY     | B     |   1 | 2012-11-04   | 2012-11-04 |
+------+---------+-------+-----+--------------+------------+
2
Gordon Linoff 20 avril 2020 à 11:40

Peut-être quelque chose comme ça:

SELECT dept,sub_dept, class,
       CASE WHEN cnt >= 1 THEN SUBSTRING_INDEX(subm_date,',',1) END AS started_date,
       CASE WHEN cnt >= 2 THEN SUBSTRING_INDEX(subm_date,',',-1) 
            WHEN cnt=1 THEN SUBSTRING_INDEX(subm_date,',',1) END AS last_date
FROM
(SELECT dept,sub_dept, class,
       GROUP_CONCAT(submission_date ORDER BY submission_date) subm_date, COUNT(*) AS cnt
       FROM test
GROUP BY dept,sub_dept, class, YEAR(submission_date)) A

Fiddle ici: https://www.db-fiddle.com/f/hkiqbTK72MNwD3ymKSBoqF/0

0
FaNo_FN 20 avril 2020 à 09:22