SQL select 分组的问题
Problèm with SQL select grouping
我有一个 SQL 服务器查询的小问题。
我对几个具有重复值的基础 table 的看法有问题,到目前为止没问题,这些重复是合乎逻辑的。不幸的是,我没有得到想要的最终结果,我可以通过对我的应用程序的前端进行编程来实现,但我更愿意在服务器上完成这项工作。
我来解释一下原理:
我有 30 家公司,每家公司都有一名员工 table。
我的观点是 30 名员工 table 的工会。
每个员工都有一个唯一的编号,这个编号在table秒内是相同的,所以可以在A公司录用名为"John Doe",ID号为'S0000021'的员工,然后调到Q公司没有任何问题,它会保留序列号 'S0000021'.
员工 tables A 和 Q 的数据之间的差异将在本示例中为公司 A 输入的开始(雇用)和释放(转移)日期以及公司 Q 的开始日期所以视图将有 2 行 "John Doe".
12个常用字段如下:
- 序列号(每个员工都相同table)
- 社会安全号码(每个员工都相同table)
- Start/Hire 日期
- Release/Transfer 日期(empty/null 如果员工在职)
- 姓名(如果此人离婚,可以跨公司更改)
- 名字
- 娘家姓
- 姓氏
- 性别
- 最终发布
- 公司代码
问题看起来很简单,我不会显示员工的最新信息,除非用group by,如果更改了名称或发布日期,它会显示两次。
我尝试了以下不同的方法,但它们return不是我想要的
我 return 两种方式都输入了结果,但我总是看到重复的结果,因为我在公司的日期从不相同,而且他们的名字可能会改变。
抱歉 Google 翻译。
1 --
select
vue.matricule,
vue.numsecu,
vue.name,
vue.lastname,
vue.maidenname,
vue.secondname,
vue.genre,
vue.released,
vue.companycode
from
vue
group by
vue.matricule,
vue.numsecu,
vue.name,
vue.lastname,
vue.maidenname,
vue.secondname,
vue.genre,
vue.released,
vue.companycode
2---
select
distinct(vue.matricule),
vue.numsecu,
vue.name,
vue.lastname,
vue.maidenname,
vue.secondname,
vue.genre,
vue.released,
vue.companycode
from
vue
我假设如下:
- 有一个视图 (vue) 已经收集了 30 家公司中每家公司的所有数据
- 您只是在寻找每个员工的最新记录
如果您还需要查看每次名称更改的记录,我们可以更改此设置。
--set up test data
declare @vue table (
matricule varchar(20),
numsecu varchar(20),
name varchar(20),
lastname varchar(20),
maidenname varchar(20),
secondname varchar(20),
genre varchar(20),
start datetime,
released datetime,
companycode varchar(20));
insert @vue values
('S0000021','123456789','John', 'Doe',null,null,'M','2015-01-01','2015-12-31','A'),
('S0000021','123456789','Johnny', 'Doe',null,null,'M','2016-01-01',null,'Q'), --new company, name change, currently employed
('S0000022','123456780','Jane', 'Doe',null,null,'M','2015-01-01','2015-12-31','A'),
('S0000022','123456780','Jane', 'Doe',null,null,'M','2016-01-01','2016-02-01','Q'); --new company, name change, terminated
select * from @vue order by matricule, start;
--get latest record for each employee
select *
from (--add row numbering
select *, row_number() over (partition by matricule order by start desc) row_num
from @vue
) vue2
where vue2.row_num = 1;
我有一个 SQL 服务器查询的小问题。
我对几个具有重复值的基础 table 的看法有问题,到目前为止没问题,这些重复是合乎逻辑的。不幸的是,我没有得到想要的最终结果,我可以通过对我的应用程序的前端进行编程来实现,但我更愿意在服务器上完成这项工作。
我来解释一下原理: 我有 30 家公司,每家公司都有一名员工 table。 我的观点是 30 名员工 table 的工会。 每个员工都有一个唯一的编号,这个编号在table秒内是相同的,所以可以在A公司录用名为"John Doe",ID号为'S0000021'的员工,然后调到Q公司没有任何问题,它会保留序列号 'S0000021'.
员工 tables A 和 Q 的数据之间的差异将在本示例中为公司 A 输入的开始(雇用)和释放(转移)日期以及公司 Q 的开始日期所以视图将有 2 行 "John Doe".
12个常用字段如下:
- 序列号(每个员工都相同table)
- 社会安全号码(每个员工都相同table)
- Start/Hire 日期
- Release/Transfer 日期(empty/null 如果员工在职)
- 姓名(如果此人离婚,可以跨公司更改)
- 名字
- 娘家姓
- 姓氏
- 性别
- 最终发布
- 公司代码
问题看起来很简单,我不会显示员工的最新信息,除非用group by,如果更改了名称或发布日期,它会显示两次。
我尝试了以下不同的方法,但它们return不是我想要的
我 return 两种方式都输入了结果,但我总是看到重复的结果,因为我在公司的日期从不相同,而且他们的名字可能会改变。
抱歉 Google 翻译。
1 --
select
vue.matricule,
vue.numsecu,
vue.name,
vue.lastname,
vue.maidenname,
vue.secondname,
vue.genre,
vue.released,
vue.companycode
from
vue
group by
vue.matricule,
vue.numsecu,
vue.name,
vue.lastname,
vue.maidenname,
vue.secondname,
vue.genre,
vue.released,
vue.companycode
2---
select
distinct(vue.matricule),
vue.numsecu,
vue.name,
vue.lastname,
vue.maidenname,
vue.secondname,
vue.genre,
vue.released,
vue.companycode
from
vue
我假设如下:
- 有一个视图 (vue) 已经收集了 30 家公司中每家公司的所有数据
- 您只是在寻找每个员工的最新记录
如果您还需要查看每次名称更改的记录,我们可以更改此设置。
--set up test data
declare @vue table (
matricule varchar(20),
numsecu varchar(20),
name varchar(20),
lastname varchar(20),
maidenname varchar(20),
secondname varchar(20),
genre varchar(20),
start datetime,
released datetime,
companycode varchar(20));
insert @vue values
('S0000021','123456789','John', 'Doe',null,null,'M','2015-01-01','2015-12-31','A'),
('S0000021','123456789','Johnny', 'Doe',null,null,'M','2016-01-01',null,'Q'), --new company, name change, currently employed
('S0000022','123456780','Jane', 'Doe',null,null,'M','2015-01-01','2015-12-31','A'),
('S0000022','123456780','Jane', 'Doe',null,null,'M','2016-01-01','2016-02-01','Q'); --new company, name change, terminated
select * from @vue order by matricule, start;
--get latest record for each employee
select *
from (--add row numbering
select *, row_number() over (partition by matricule order by start desc) row_num
from @vue
) vue2
where vue2.row_num = 1;