2016-04-29 13 views
0

従業員の名前、部門、スーパーバイザ、および現在のステータスを返すクエリを作成しようとしています。しかし、問題のテーブルには、各従業員の現在のレコードと履歴レコードが含まれています。1NF以外のテーブルから最新のユニークレコードを取得するにはどうすればよいですか?

従業員ごとに最新のレコードを取得するにはどうすればよいですか?私は単純にMAX(Effective_Date)列を選択して、最後のレコードのみをプルしようとしました。ただし、各レコードには従業員のIDと、レコードのIDはのため、データセットでは必ずしも機能しません。

はここで完全なテーブルの設定の例です:Filedropper.com/exampledata

そして、ここで私が持っている現在のコードの例です。

use ws_er; 
select 
od.Master_org_dim_id 
,od.Member_Last_Name + ', ' + od.Member_First_Name as [Associate Name] 
,od.Member_Role as [Tier] 
,od.Member_Status as [Status] 
,sod.member_last_name + ', ' + sod.member_First_name as [Supervisor Name] 
,MAX(od.Effective_Date) as [Effective Date] 
,COUNT(od.Master_org_dim_id) as [count] 

from Organization_Dim as od 
inner join organization_dim as sod on sod.org_dim_id = od.supervisor_dim_id 

group by 
od.Master_org_dim_id 
,od.Member_Last_Name + ', ' + od.Member_First_Name 
,od.Member_Role 
,od.Member_Status 
,sod.member_last_name + ', ' + sod.member_First_name 

order by [associate name] desc 
+0

テーブルデザインを投稿します。 Donは私たちがリンク元に行くことを期待しています。 – Paparazzi

+0

私は申し訳ありませんが、私はテキストの中にテーブルデザインを置く正しい方法が不明でした。私はそれを調整します。 – Smith

答えて

1
select * 
from 
(select * 
     , row_number() over (partition by od.Master_org_dim_id,  
             od.Member_Last_Name, 
             od.Member_First_Name 
           order by od.Effective_Date desc) as rn 
     , count(od.Master_org_dim_id) over (partition by od.Master_org_dim_id, 
                 od.Member_Last_Name, 
                 od.Member_First_Name) as count 
from Organization_Dim 
) odr 
join organization_dim as sod 
    on sod.org_dim_id = odr.supervisor_dim_id 
and odr.rn = 1 

しかし、これは

on sod.org_dim_id = odr.supervisor_dim_id 
だけ少ないし、完全に未定義の状態である。このような何か

私はあなたが想像して取得する必要があると思うし、日付にスーパーバイザーを決定するが、これはあなたを開始する必要があります。それでもあなたは0人以上の監督者を返すことができます。

従業員の名前が異なると、これが壊れます。このデータ設計が最適ではないことを私はあなたに伝える必要はありません。

+0

あなたが探しているすべてのデータを取得するには、内側のクエリで 'count(od.Master_org_dim_id)over(od.Master_org_dim_id、od.Member_Last_Name、od.Member_First_Name)をcountとして使用する必要があると思います。 –

+0

@BaconBits私は同意すると思う – Paparazzi

0

従業員IDごとに最大日付を取得するサブクエリに参加し、そのサブクエリに日付を使用できます。

use ws_er; 
select 
od.Master_org_dim_id 
,od.Member_Last_Name + ', ' + od.Member_First_Name as [Associate Name] 
,od.Member_Role as [Tier] 
,od.Member_Status as [Status] 
,sod.member_last_name + ', ' + sod.member_First_name as [Supervisor Name] 
,mxd.EffectiveDate as [Effective Date] 
,COUNT(od.Master_org_dim_id) as [count] 

from Organization_Dim as od 
inner join organization_dim as sod on sod.org_dim_id = od.supervisor_dim_id 
inner join (select Master_org_dim_id, max(Effective_Date) EffectiveDate from Organization_Dim group by Master_org_dim_id) as mxd 
on od.Master_org_dim_id = mxd.Master_org_dim_id 

group by 
od.Master_org_dim_id 
,od.Member_Last_Name + ', ' + od.Member_First_Name 
,od.Member_Role 
,od.Member_Status 
,sod.member_last_name + ', ' + sod.member_First_name 
,mxd.EffectiveDate 

order by [associate name] desc 

テストされていないが、右方向へのトリック、または少なくともポイントあなたを行う必要があります

関連する問題