2016-07-27 20 views
-1

Ich habe 2 Tabellen wie unten zu sehen: enter image description herekann ich fix mein GROUP BY-Klausel

Nun ist die Frage: Wie kann ich eine Ansicht, die die Details des letzten Besitzers zeigt? mit anderen Worten brauche ich die Details der Person, die MAX (StartDate) in tbl_Owners Tabelle hat? Ich möchte den neuesten Besitzer jeder Wohnung finden. Ich versuchte verschiedene Ansätze, aber ich konnte den Weg nicht finden. Ich weiß, ich brauche die personID in einer GROUP BY-Klausel, die Gruppen Aufzeichnungen von AppID zu bekommen, aber ich nicht, dass

Sie

+0

'wählen MAX (Startdatum) gelten mit ...................... GRUPPE BY Orners.PersonID' –

+0

Was ist Ihre Sql-Serverversion? Bitte gut markieren. Wenn es die Funktion row_number() over() 'unterstützt, dann benutze es. – Serg

+0

@Serg es ist 2014 Version –

Antwort

2

Versuchen Sie, diese

select t1.* from tbl_persons as t1 inner join 
(

    select t1.* from tbl_owners as t1 inner join 
     (
     select appid,max(startdate) as startdate from tbl_owners group by appid 
     ) as t2 
     on t1.appid=t2.appid and t1.startdate=t2.startdate 
) as t2 
on t1.personid=t2.personid 
+0

Danke. Es klappt. –

1

hinzufügen Zu Ihrer Anfrage Vielen tun können:

JOIN (select AppId, MAX(StartDate) as MAxStartDate 
     from dbo.tbl_Owners 
     group by PersonId) o2 
    ON dbo.tbl_Owners.AppId= o2.AppId and 
     dbo.tbl_Owners.StartDate = o2.MAxStartDate 

Die Unterabfrage oben gibt jede AppId zusammen mit dem neuesten StartDate zurück. Self-Beitritt mit diesem Ergebnis wird Ihnen geben, was Sie wollen.

+0

Ich muss den neuesten Besitzer jeder Wohnung finden. Also ich denke ich sollte nach appID gruppieren –

+0

Natürlich werde ich bearbeiten! – jarlh

1

Sie CTE für diesen Zweck verwenden können

;WITH CTE AS 
(
    SELECT AppID,PersonID,StartDate, 
      ROW_NUMBER() OVER (PARTITION BY AppID ORDER BY StartDate DESC) RN 
    FROM TableNAme 
    GROUP BY AppID,PersonID,StartDate 
) 
SELECT * FROM CTE 
WHERE RN=1 
1
SELECT dbo.tbl_Owners.*,dbo.tbl_Persons.PersonFullname FROM dbo.tbl_Owners 
INNER JOIN 
dbo.tbl_Persons ON dbo.tbl_Owners.PersonID=dbo.tbl_Persons.PersonID 
GROUP BY dbo.tbl_Owners.StartDate HAVING MAX(StartDate); 

Verwenden GROUP BY auf Startdatum stattdessen auf PersonID.

+1

HABEN aber keine GROUP BY, und immer noch ein upvote!?! – jarlh

1

ROW_NUMBER

select t.*, p.* -- change as needed 
from (select *, rn= row_number() over(partition by AppID order by StartDate desc) 
     from dbo.tbl_Owners 
    ) t 
join dbo.tbl_Persons p on t.rn=1 and t.PersonId = p.PersonId 

Quer

select t.*, p.* -- change as needed 
from dbo.tbl_Persons p 
cross apply (
    select top(1) * 
    from dbo.tbl_Owners o 
    where o.PersonId = p.PersonId 
    order by o.StartDate desc 
    ) t