如何在不重复员工 ID 的情况下计算表中的姓氏
Posted
技术标签:
【中文标题】如何在不重复员工 ID 的情况下计算表中的姓氏【英文标题】:How to count last names in a table without duplicating employee ID 【发布时间】:2020-01-21 15:22:39 【问题描述】:我有一个员工表,其中包含重复的员工实例。例如,姓 Baba 可能会使用相同的员工 ID 出现 2 次。我必须从表中计算姓氏,但不想将同一个计算两次。
我正在 Postgres 中编写 SQL。这是我从中提取查询的表:
CREATE TABLE Employee (
emp_no int NOT NULL,
birth_date date NOT NULL,
first_name varchar(100) NOT NULL,
last_name varchar(100) NOT NULL,
gender varchar(100) NOT NULL,
hire_date date NOT NULL,
CONSTRAINT pk_Salaries PRIMARY KEY (
emp_no
)
);
给出的数据包含重复数据。我无法删除重复项,但不想计算它们。这是我的查询语句:
SELECT Employee.last_name, COUNT(Employee.last_name) AS "Last Name Count"
FROM Employee
GROUP BY Employee.last_name
ORDER BY "Last Name Count" DESC;
输出效果很好,但我确信它不止一次地计算了一些姓氏。 我尝试添加一个 WHERE 原因来获取 emp_no 不同但不起作用的姓氏计数。
【问题讨论】:
我不清楚你想要实现什么。请添加几行示例数据,以及预期的结果。 你为什么“确定它不止一次计算一些姓氏”? 谢谢,我不确定它是否将同一个人计算了两次。我假设这是因为我要求对姓氏进行计数,并且一个人可能会出现多次(以姓名)但只有一个员工 ID。因此,我不希望那个人的姓氏被计算一次以上。 首先您的描述与表定义不匹配,您提到了员工 ID,但该列不存在。我假设这是一个错字,你的意思是emp_no。在那种情况下,您描述的情况“一个人可能会出现多次(以名义)但只有一次”emp_no 不可能发生。这将需要在两行中使用相同的 emp_no,这是不可能发生的,因为 emp_no 被定义为 PK,因此在表中是唯一的。您需要查看其他列以确定个人是否重复;比如名字和出生日期。 【参考方案1】:您想计算表格中的姓氏,但不要将同一个名字计算两次。 所以试试这个:
"SELECT Employee.last_name, COUNT(DISTINCT Employee.last_name) AS "Last Name Count" FROM Employee GROUP BY Employee.last_name"
【讨论】:
谢谢你,我的总数是 1638 是的,没有重复【参考方案2】:emp_no 是主键,因此它必须是唯一的,并且带有 distinct 的 where 子句不会产生影响。该查询似乎是准确的,如果它不止一次计算姓氏,我会感到惊讶。
【讨论】:
emp_no
不是重复的情况,而是last_name
。
感谢您的回复
而初始查询中的“group by”处理得非常好【参考方案3】:
在应用COUNT()
聚合时只需使用distinct
关键字:
SELECT e.last_name, COUNT(distinct e.last_name) AS "Last Name Count"
FROM Employee e
GROUP BY e.last_name
ORDER BY "Last Name Count" DESC;
【讨论】:
谢谢。每个姓氏都返回一个。【参考方案4】:您应该尝试验证每个姓氏是否唯一计算名字
类似的东西
SELECT Employee.last_name, COUNT(distinct Employee.first_name) AS "Last Name Count"
FROM Employee
GROUP BY Employee.last_name
ORDER BY "Last Name Count" DESC;
看小提琴
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=f0a9568e6cb5fb5e0247d2f2c5e95114
或者如果有必要检查是否有更多的数据在两行中重复,做类似的事情
select distinct * from (
SELECT Employee.last_name,
COUNT(*) over (partition by first_name, birth_date, last_name, gender) AS n
FROM Employee
) V
where n > 1
看小提琴
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=223143f0d603abf30d99ad87fa07781e
【讨论】:
这确实返回了一个新号码,问题是一些员工的名字和姓氏相同,但员工号码不同。换句话说,他们是同名的不同人。非常感谢您的回复。 @Cmac 在我的答案的第二个查询中,您可以添加检测重复注册表所需的所有列【参考方案5】:感谢大家的快速回复。他们都非常好,乐于助人!
我运行以下代码发现我错了,每个人在表中只有一个实例,并且只有一个唯一的员工 ID (emp_no)。
SELECT Employee.emp_no, COUNT(Employee.emp_no) AS "Employee ID Count" 来自员工 GROUP BY Employee.emp_no 按“员工 ID 计数”ASC 排序;
再次感谢大家!
【讨论】:
以上是关于如何在不重复员工 ID 的情况下计算表中的姓氏的主要内容,如果未能解决你的问题,请参考以下文章