2016-07-27 118 views
-1

我有2个表,如下图所示: enter image description here如何解决我的GROUP BY子句

现在的问题是: 怎样才可以有一个视图,显示最后一个用户的详细信息?换句话说,我需要在tbl_Owners表中拥有MAX(StartDate)的人员的详细信息? 我想找到每间公寓的最新拥有者。 我尝试了不同的方法,但是我找不到这样做的方法。 我知道我需要在集团PERSONID By子句它通过的AppID组中的记录,但我不能这样做,

谢谢

+0

使用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 

'选择MAX(起始日期)...................... 。GROUP BY Orners.PersonID' –

+0

什么是您的Sql服务器版本?请正确标记。如果它支持'row_number()over()'函数然后使用它。 – Serg

+0

@Serg它是2014版本 –

回答

2

试试这个

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

谢谢。有用。 –

1

添加到您的查询:

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 

的上面的子查询返回每个AppId及其最新的StartDate。自我加入的结果会给你你想要的。

+0

我需要找到每间公寓的最新拥有者。所以我想我应该通过appID –

+0

进行分组当然,我会编辑! – jarlh

1

您可以使用CTE为此,

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

使用GROUP BY的起始日期,而不是上是PersonID。

+1

HAVING但没有GROUP BY,仍然是upvote!?! – jarlh

1

使用交叉申请

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