Мне нужно количество уникальных комбинаций из 3 столбцов в год - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть такая таблица данных:

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

результат должен выглядеть следующим образом:

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

В первой строке (ENG, CS, A) дата отправки равна 12 -06-2012, поэтому я хочу выяснить, сколько там строк с одинаковой комбинацией, такой как ENG, CS, A, в течение 12-06-2012 и 12-06-2013 (дата подачи первого вхождения должна рассматриваться как начальная дата ). Хотя 4-я строка имеет ту же комбинацию, но не l ie в год, начиная с первого появления, поэтому она должна быть представлена ​​отдельно (не должна учитываться при подсчете). дата начала и последняя дата - это первое и последнее вхождения комбинаций в течение года после первого вхождения. Я делаю это в MySQL (версия -5.6). Для этой проблемы можно использовать либо базовый c mysql запрос, либо даже хранимую процедуру. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020
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');

Запрос

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)

Результирующий набор

+------+---------+-------+-----+--------------+------------+
| 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 |
+------+---------+-------+-----+--------------+------------+
0 голосов
/ 20 апреля 2020

Возможно, что-то вроде этого:

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

Скрипка здесь: https://www.db-fiddle.com/f/hkiqbTK72MNwD3ymKSBoqF/0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...