我们有两个SQL Server表,dbo.parent
和dbo.child
.它是一个具有多个子元素的父级的一对多关系.每个子元素都有一个唯一的名称和effectiveTimestamp
个值.
下面的当前工作查询将接受一个已知父代的数组,并 for each 父代从dbo.child
中查找当前有效的子代.通过获取仍小于当前日期/时间的最大值effectiveTimestamp
的子项来计算有效子项.这个查询运行得很好.
父元素可以只具有future 日期为effectiveTimestamp
(晚于当前日期/时间)的子元素.在这种情况下,上面的查询不会返回这些父代的任何内容.目前,我们通过对第一个查询中没有返回的任何父代运行不同的第二个查询来实现这一点,但我觉得这是不必要的,希望将所有内容都包括在一个SQL查询中.
因此,我希望修改下面的查询,这样,如果父代没有有效的子代,则无论是否小于当前日期/时间,它都会查找最大值effectiveTimestamp
.
SELECT
parentid,
child.id,
name,
child.effectivetimestamp
FROM
dbo.child AS child
INNER JOIN
(SELECT
Max([id]) AS id,
Max([effectivetimestamp]) AS effectiveTimestamp
FROM
dbo.child
WHERE
parentid IN (1, 2, 3, 4, 5)
AND effectivetimestamp <= GETDATE()
GROUP BY
parentid) AS effectiveVersion ON child.id = effectiveVersion.id
ANSWER个
感谢大家的回应,我收到了多个解决方案,我相信会有工作.最后我使用了siggemannen建议的row_number().完整解决方案如下:
SELECT parentid,
child.id,
name,
child.effectivetimestamp
FROM dbo.child AS child
INNER JOIN (SELECT *
FROM (SELECT *,
Row_number()
OVER(
partition BY parentid
ORDER BY CASE WHEN effectivetimestamp <=
Getdate(
) THEN 0
ELSE 1 END
,
effectivetimestamp DESC) AS 'rnk'
FROM dbo.child) AS c
WHERE parentid IN ( 1, 2, 3, 4, 5 )
AND rnk = 1) AS effectiveVersion
ON child.id = effectiveVersion.id