2016-04-29 9 views
0

Ich versuche eine Abfrage zu erstellen, die den Namen, die Abteilung, den Supervisor und den aktuellen Status eines Mitarbeiters zurückgibt. Die fragliche Tabelle enthält jedoch historische Aufzeichnungen und aktuelle Aufzeichnungen jedes Mitarbeiters, einschließlich eines Datensatzes für jeden Vorgesetzten, jede Abteilung usw.Wie kann ich den letzten eindeutigen Datensatz aus einer Tabelle nicht in 1NF abrufen?

Wie kann ich den neuesten Datensatz für jeden Mitarbeiter abrufen? Ich habe versucht, einfach die Spalte MAX (Effective_Date) auszuwählen, um nur den letzten Datensatz zu ziehen. Allerdings bedeutet dies nicht immer mit dem Datensatz arbeiten, da jeder Datensatz eine ID für die Mitarbeiter hat, sowie eine ID für den Rekord.

Hier ist ein Beispiel für die vollständige Tabelle Setup: Filedropper.com/exampledata

Und hier ist ein Beispiel für den aktuellen Code ich habe.

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

Veröffentlichen Sie das Tabellen-Design. Erwarten Sie, dass wir zu einer verbundenen Quelle gehen. – Paparazzi

+0

Es tut mir leid, ich war nicht sicher über den richtigen Weg, um das Tischdesign in den Text zu setzen. Ich werde das anpassen. – Smith

Antwort

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 

Aber dies ist nur ein kleiner dann völlig undefinierten Zustand

on sod.org_dim_id = odr.supervisor_dim_id 

Ich vermute, dass Sie werden müssen, Phantasie und bestimmen Sie den Supervisor auf das Datum, aber das sollte Sie beginnen. Selbst damit könnten Sie null oder mehr Supervisor zurückgeben.

Wenn ein Mitarbeiter Name war anders dieses Pausen eingegeben. Ich muss Ihnen nicht sagen, dass dieses Datendesign nicht optimal ist.

+0

Ich glaube, Sie brauchen eine 'count (od.Master_org_dim_id) über (Partition von od.Master_org_dim_id, od.Member_Last_Name, od.Member_First_Name) als count' in Ihrer inneren Abfrage alle Daten zu erhalten, sie sucht. –

+0

@BaconBits Ich denke, ich stimme zu – Paparazzi

0

Sie können zu einer Unterabfrage verbinden, in dem Sie den max Datum pro Mitarbeiter-ID, und dann das Datum verwenden, um diese Unterabfrage. Etwas wie folgt aus:

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 

Ungeprüfte, aber sollte es tun, oder zumindest Punkt, den Sie in die richtige Richtung

Verwandte Themen