子孩子选择最近的记录
问题描述:
我有以下表/列:子孩子选择最近的记录
Parent:
ParentID
Child:
ChildID
ParentID
SubChild:
SubChildID
ChildID
Date
Parent
有1与Child
Child
有1一对多的关系,以一对多的关系与SubChild
对于每Parent
,我需要得到SubChild
与最新的Date
值。 我该如何使用SQL来做到这一点。我试过使用MAX(Date)
, ,但我似乎无法弄清楚如何成功加入Parent
和Child
。
理想的结果集将包含所有Parent
s加入所有最新记录的SubChild
列。
注意:在使用MS SQL 2005+
答
看一看使用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
答
对于一些数据分布这种方法可能会更快。
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
答
为了简单起见,您可以做一个子选择。在我的测试这种具有相同的性能作为“跨应用”的方法:
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(降序排列)和显示列被包括在内)。这将47k记录中的查询时间降低到1秒以内。