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个常用字段如下:

问题看起来很简单,我不会显示员工的最新信息,除非用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;