2016-08-09 39 views
0

Ich habe das Gefühl, das ist ganz einfach, aber ich kann mich nicht auf die Abfrage legen. Ich versuche alle Aktivitäten eines Mitarbeiters zu finden, die ihrem Startdatum an einem bestimmten Ort entsprechen.Abfrage, um Datumszeilen älter als ein Startdatum zu erhalten (nicht eine einfache WHERE)

create table Locations (EmployeeID int, LocationID int, StartDate date); 

create table Activities (EmployeeID int, ActivityID int, [Date] date); 

insert into Locations values 
    (1, 10, '01-01-2010') 
    , (1, 11, '01-01-2012') 
    , (1, 11, '01-01-2013'); 

insert into Activities values 
    (1, 1, '02-01-2010') 
    , (1, 2, '04-01-2010') 
    , (1, 3, '06-06-2014'); 

Erwartetes Ergebnis:

EmployeeID LocationID StartDate  EmployeeID ActivityID Date 
1   10   '01-01-2010' 1   1   '02-01-2010' 
1   10   '01-01-2010' 1   2   '04-01-2010' 
1   11   '01-01-2013' 1   3   '06-06-2014' 

Bisher habe ich das, aber es ist durchaus nicht geben mir das Ergebnis, das ich gehofft hatte. Ich muss irgendwie nur auf die Informationen vom letzten Standort verweisen, die die la.StartDate <= a.Date nicht ausfiltert und auch Informationen von älteren Standorten enthält.

select * 
from Locations la 
    inner join Activities a on la.EmployeeID = a.EmployeeID 
     and la.StartDate <= a.Date 
+0

Das ist schlecht, Datenbank-Design. In der Tabelle Aktivitäten sollte ein FK in der Tabelle Aktivitäten vorhanden sein. – mxix

+0

@mxix Ich stimme zu, aber das ist, woran ich arbeiten muss. –

+0

Können Sie ein EndDate an Standorten einführen? Das würde die Dinge ein wenig vereinfachen. – NickyvV

Antwort

0

Vielen Dank, aber ich schaffte es die Antwort zu finden:

select * 
from LocationAssociations la 
    inner join Activities a on la.EmployeeID = a.EmployeeID 
     and la.StartDate = (select max(StartDate) from LocationAssociations where StartDate >= la.StartDate and StartDate <= a.Date) 
+1

Sie brauchen wahrscheinlich nicht 'und la.StartDate <= a.date' – JamieD77

+0

@ JamieD77 Ja, Sie haben Recht, da die zweite Bedingung in der JOIN restriktiver ist. Danke, dass du das unterstrichen hast! –

0

Geben Sie diesem einen Versuch:

with Locations as (
select 
* 
from (values 
    (1, 10, '01-01-2010') 
    , (1, 11, '01-01-2012') 
    , (1, 11, '01-01-2013') 
) la (EmployeeID, LocationID, StartDate) 
), 
Activities as (
select 
* 
from (
values 
    (1, 1, '02-01-2010') 
    , (1, 2, '04-01-2010') 
    , (1, 3, '06-06-2014') 
) a (EmployeeID, ActivityID, [Date]) 
) 
select 
    la.*, 
    a.* 
from Activities a 
cross apply (
    select 
    * 
    from (
     select 
      la.*, 
      ROW_NUMBER() OVER (
       PARTITION BY 
        EMPLOYEEID 
       ORDER BY 
        DATE DESC 
      ) seqnum 
     from Locations la 
     where 
      la.EmployeeID = a.EmployeeID and 
      la.StartDate <= a.Date 
    ) la 
    where 
     la.seqnum = 1 
) la 
+1

Dies erhält nicht den richtigen Ort für die letzte Zeile, Sie haben immer den Standort 1 (aufgrund von 'la.seqnum = 1'). – NickyvV