SQL:当max位于多个列上时,如何获取行
我正在使用Microsoft SQL Server 2008 R2 我有一个名为employee的表: 我有一张名为“资格”的表。它有一个FK到employee表。它有一个由3列组成的唯一键:员工id+生效日期+序列号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
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