我有以下表格/列:
Parent:
ParentID
Child:
ChildID
ParentID
SubChild:
SubChildID
ChildID
Date
Parent
与Child
Child
与SubChild
对于每个Parent
,我需要获取具有最新SubChild
值的Date
。
我怎么能用SQL做到这一点。我尝试过使用MAX(Date)
,
但我似乎无法弄清楚如何成功加入Parent
和Child
。
理想的结果集将包含与最新记录的所有Parent
列相关联的所有SubChild
。
注意:使用 MS SQL 2005 +
答案 0 :(得分:3)
查看使用ROW_NUMBER
像
这样的东西;WITH Vals AS (
SELECT p.ParentID,
sc.SubChildID,
ROW_NUMBER() OVER (PARTITION BY p.ParentID ORDER BY sc.[Date] DESC) RowID
FROM Parent p INNER JOIN
Child c ON p.ParentID = c.ParentID INNER JOIN
SubChild sc ON c.ChildID = sc.ChildID
)
SELECT ParentID,
SubChildID
FROM Vals
WHERE RowID = 1
答案 1 :(得分:2)
对于某些数据分发,这种方法可能会更快。
SELECT p.ParentID,
sc.SubChildID,
sc.Date
FROM Parent p
CROSS APPLY (SELECT TOP(1) s.SubChildID,
s.Date
FROM SubChild s
JOIN Child c
ON c.ChildID = s.ChildID
WHERE c.ParentID=p.ParentID
ORDER BY s.Date DESC) sc
答案 2 :(得分:0)
您可以使用相关子查询来执行此操作,但使用SQL Server 2005 ranking functions会更快。只要你知道你在做什么,那就是。
答案 3 :(得分:0)
为了简单起见,您可以进行子选择。在我的测试中,它具有与“交叉应用”方法相同的性能:
select firstname, lastname,
(Select top 1 Display from _notes where _notes.ParentId = c.Id order by createdon desc) as MostRecentNote
from _contacts c
对于47k记录,这种“子选择”方法大约需要4秒钟。为了加快速度,我在_Notes上添加了一个排序索引,包括ParentId,CreatedOn(Sorted descending)和Display列。这会使查询在47k记录上不到1秒。