【问题标题】:SQL group by function to categorize only the most recent dataSQL 按功能分组以仅对最新数据进行分类
【发布时间】:2021-05-08 16:28:22
【问题描述】:

所以我有一个名为 title 的表,其中存储了每个员工持有的所有头衔,看起来像这样

emp_no title start_date
101 Engineer 2019-01-01
101 Senior Engineer 2020-02-01
102 Engineer 2019-01-11
102 Senior Engineer 2020-02-11
103 Engineer 2019-01-21
104 Engineer 2019-01-31
105 Associate 2019-01-01
106 Associate 2019-01-11
106 Manager 2020-02-11
107 Associate 2019-01-21
107 Manager 2020-02-21
108 Associate 2019-01-31

请注意,每位员工可以拥有多个头衔。例如emp 101的职称是2019年1月1日的工程师,一年后晋升为高级工程师。

现在假设我想计算每个职位有多少员工。我曾尝试将 count 函数与 group by 一起使用(按职位对员工人数进行分组),但问题是,SQL 查询还计算每个员工的过去职位。

确切地说,我只想包含员工当前拥有的最新角色。所以在这种情况下,我期待的结果是 工程师:2名员工(因为另外2名已晋升为高级工程师), 高级工程师:2名, Associate:2 名员工(因为另外 2 名已晋升为经理), 经理:2名员工

有什么方法可以实现吗? 注意:此表格格式来自我正在学习的 SQL 在线课程之一,因此我不是制作表格的人。而且在原始表中也包含了上万条数据。

【问题讨论】:

标签: mysql sql


【解决方案1】:

您可以在计数时简单地过滤 where 条件下的数据。查询如下:

select title, count(distinct emp_no) as Count
from (select emp_np, title, max(start_date) as start_date
      from table 
      group by emp_np, title) subset
group by title

【讨论】:

  • 这里不需要做SELECT DISTINCT,GROUP BY不返回重复项。
  • 您好,谢谢您的回答,但是当我尝试运行查询时,sql 出错,提示“错误代码:1248。每个派生表都必须有自己的别名”
  • 对不起,我忘了重命名内表。我已经编辑了查询。现在应该可以工作了!
【解决方案2】:

我将推荐一个相关子查询,但出于一个非常特殊的原因:

select title, count(*)
from t
where t.start_date = (select max(t2.start_date)
                      from t t2
                      where t2.emp_no = t.emp_no
                     );

建议这样做的具体原因是,很容易根据“截至”特定日期的员工人数来修改它。例如,如果您想要截至 2019 年 1 月 1 日的员工人数,请将 where 更改为:

where t2.emp_no = t.emp_no and t2.start_date <= '2019-01-01'

【讨论】:

  • 啊,我明白了,这增加了某种多功能性。是的,我想当我想应用日期过滤器时这很重要。也可以,谢谢大佬!干杯!
【解决方案3】:
select title,COUNT(*) numberOfEmp from 
(
  select distinct emp_no
  ,(select top  1 title from [dbo].[Tbl_title] a where  a.emp_no=m.emp_no
  order by [start_date] desc
  ) title
  from [dbo].[Tbl_title] m
) mTable
group by title

【讨论】:

  • 对未指定 dbms 的问题的产品特定答案。至少告诉我们这是用于哪个 dbms。
  • 我的错,我正在使用 MySQL
【解决方案4】:

你可以使用not exists如下:

select title, count(*) as Count
  from your_table t
 where not exists 
       (select 1 from your_table tt
         where tt.emp_no = t.emp_no and tt.start_date> t.start_date)
group by title

【讨论】:

  • 嗨,所以表名是'titles',所以我应该用titles替换your_table对吗?那么'tt'蚂蚁't'呢?我也应该用“标题”替换它们吗?因为当我这样做时,SQL 仍然会计算已提升员工的所有以前的头衔
  • 哦,没关系,我尝试只用我的表名替换“your_tables”,留下“tt”和“t”。谢谢你。但是'tt'和't'的功能是什么?你给的只是某种别名或昵称吗?
  • 是的,你是对的。它被称为别名。
  • 非常感谢老兄!干杯!
  • 您可以考虑接受其中一个答案作为正确答案,以便将此问题标记为已解决。
猜你喜欢
  • 2021-10-27
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2013-04-18
相关资源
最近更新 更多