SQL:当max位于多个列上时,如何获取行

SQL:当max位于多个列上时,如何获取行,sql,sql-server,Sql,Sql Server,我正在使用Microsoft SQL Server 2008 R2 我有一个名为employee的表: 我有一张名为“资格”的表。它有一个FK到employee表。它有一个由3列组成的唯一键:员工id+生效日期+序列号 create table eligibility ( eligibility_id bigint not null primary key, employee_id bigint not null foreign key references employee (em

我正在使用Microsoft SQL Server 2008 R2

我有一个名为employee的表:

我有一张名为“资格”的表。它有一个FK到employee表。它有一个由3列组成的唯一键:员工id+生效日期+序列号

create table eligibility (
   eligibility_id bigint not null primary key,
   employee_id bigint not null foreign key references employee (employee_id), 
   effective_date date not null,
   sequence_number int not null,
   value varchar(20) not null,
   constraint UK_eligibility unique (employee_id, effective_date, sequence_number)
)
我在employee表中有一行employee_id=1001:

insert into employee (employee_id, first_name, middle_name, last_name) values (1001, 'A', 'B', 'C')
对于相同的员工id,我在资格表中有4行:

insert into eligibility (eligibility_id, employee_id, effective_date, sequence_number, value) values (1, 1001, '2016-04-13', 1, 'NS')
insert into eligibility (eligibility_id, employee_id, effective_date, sequence_number, value) values (2, 1001, '2016-05-25', 1, 'EX')
insert into eligibility (eligibility_id, employee_id, effective_date, sequence_number, value) values (3, 1001, '2016-05-25', 2, 'VR')
insert into eligibility (eligibility_id, employee_id, effective_date, sequence_number, value) values (4, 1001, '2016-06-05', 1, 'LS')
从资格表中,对于给定的日期,我希望得到最大有效日期+序列号组合小于或等于该给定日期的行

示例: 对于2016-04-30日期,我希望该行的合格性_id=1。 对于2016-05-30日期,我希望该行的合格性为3。 对于2016-06-30日期,我希望该行的合格性为4

我编写了查询以获得所需的结果。这是2016-05-30日期的查询:

这个查询还可以,但我想尝试以不同的方式编写它,以获得相同的结果。你还可以推荐其他的方式吗

Hmmm,我会使用行号:

嗯,我会用排号:


在我看来,这就像是带领带的TOP-1:

SELECT TOP 1 WITH TIES *
FROM eligibility e
WHERE e.effective_date <= '2016-05-30'
ORDER BY e.effective_date DESC, sequence_number DESC

在我看来,这就像是带领带的TOP-1:

SELECT TOP 1 WITH TIES *
FROM eligibility e
WHERE e.effective_date <= '2016-05-30'
ORDER BY e.effective_date DESC, sequence_number DESC

您希望通过重写来改进查询的哪些特征?获得相同结果的不同方法提供了无限多的可能性。@JohnBollinger我不喜欢where子句中我使用资格表的两次。您希望通过重写来改进查询的哪些特征?获得相同结果的不同方法提供了无限多的可能性。@JohnBollinger我不喜欢在where子句中使用资格表的两次
select e.*
from (select e.*,
             row_number() over (partition by employee_id order by effective_date desc, sequence_number desc
                               ) as seqnum
      from eligibility e
     ) e
where seqnum = 1;
SELECT TOP 1 WITH TIES *
FROM eligibility e
WHERE e.effective_date <= '2016-05-30'
ORDER BY e.effective_date DESC, sequence_number DESC