2016-06-29 3 views
0

Microsoft SQL Server 2008 R2で作業しています。SQL:最大値が1列以上のときに行を取得する方法

私はテーブルが従業員という名前があります:私は資格という名前のテーブルを持っている

create table employee (
    employee_id bigint not null primary key, 
    first_name varchar(50) not null, 
    middle_name varchar(50) null, 
    last_name varchar(50) not null 
) 

を。それにはFKから従業員のテーブルがあります。これは、employee_id + effective_date + sequence_numberという3つの列で構成される一意のキーを持ちます。

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') 

より:

insert into employee (employee_id, first_name, middle_name, last_name) values (1001, 'A', 'B', 'C') 

私は同じEMPLOYEE_IDため適格表の4行を有する:

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) 
) 

IはEMPLOYEE_IDと1行の従業員テーブル= 1001を有します資格テーブル、与えられた日付のために私は最大(有効な日付+シーケンス番号)の行を取得したいc指定された日付よりも小さいか同じである。

例: 2016-04-30日のために私は私がeligibility_idを持つ行を望むeligibility_id 2016-06-30日のために= 3
で行をしたいと思う2016-05-30日のために= 1 eligibility_idを持つ行を望みます= 4.

私は希望の結果を得るためにクエリを書いています。

select * from eligibility e 
where 
    e.effective_date = (select max(e1.effective_date) 
          from eligibility e1 
          where e1.employee_id = e.employee_id and 
           e1.effective_date <= '2016-05-30') AND 
    e.sequence_number = (select max(e2.sequence_number) 
          from eligibility e2 
          where e2.employee_id = e.employee_id and 
           e2.effective_date = e.effective_date) 

クエリはOKですが、私は同じ結果を得るために、いくつかの異なる方法でそれを書く試してみたい:これは2016-05-30日付のクエリです。あなたがお勧めする他の方法は何ですか?

+0

を? 「同じ結果を得るためのいくつかの異なる方法」は、無限に多くの可能性を提供します。 –

+0

@JohnBollinger私は2回好きではないwhere句で適格性テーブルを使用しています – srh

答えて

3

うーん、私はrow_number()を使用します。

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; 
1

これは、タイで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 
関連する問題