【问题标题】:I need counts of unique combinations of 3 columns in a year我需要一年中 3 列的唯一组合计数
【发布时间】:2025-12-18 23:30:02
【问题描述】:

我有这样的数据表:

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,所以我想找出在 12-06-2012 内有多少行与 ENG,CS,A 相同的组合和 12-06-2013(首次出现提交日期应视为初始日期)。虽然第 4 行具有相同的组合,但不位于从第一次出现开始的年份,因此应单独表示(不得计入计数)。 开始日期和最后日期是组合在一年内第一次出现的第一次和最后一次出现。 我在 MySQL(版本-5.6)中这样做。对于这个问题,可以使用基本的 mysql 查询甚至存储过程。 提前致谢。

【问题讨论】:

  • GROUP BY、COUNT()、MIN()/MAX()
  • 感谢@Akina 的回复。您能用查询或存储过程详细说明吗?
  • 您使用的是 MySQL 还是 MS SQL Server?
  • @jarlh 感谢您的回复。我正在使用 MySQL(5.6 版)
  • submission-date 列的数据类型是什么? varchar?

标签: mysql sql stored-procedures


【解决方案1】:
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 |
+------+---------+-------+-----+--------------+------------+

【讨论】:

    【解决方案2】:

    也许是这样的:

    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

    【讨论】:

    • 感谢您的回复。但是结果中缺少 count。我需要每年在相同组合中出现的次数。 (请再次检查问题)