我在sql server中有子表(位置x,位置y)和父表(位置x,位置y)。我想要的是找到每个孩子最亲近的父母。我可以做到“糟糕的方式”,但可能没有使用任何循环的解决方案。
那是我的代码:
SELECT
child.idChild, child.x, child.y,
parent.idParent, parent.x, parent.y,
sqrt(power(child.x - parent.x, 2) + power(child.y - parent.y, 2)) as distance
FROM
child
CROSS JOIN
parent
ORDER BY
idChild, distance
好的,那很好。但是现在我想把每个孩子的父母限制在TOP1。
由于
答案 0 :(得分:1)
一种方便的方法是使用窗口功能。要获得第一行,您可以使用row_number()
或rank()
。有关系时有区别。 row_number()
仅返回多个值中的一个。 rank()
将返回所有这些内容。
以下是编写查询的一种方法:
select idChild, x, y, idParent, parentx, parenty
from (SELECT child.idChild, child.x, child.y,
parent.idParent, parent.x as parentx, parent.y as parenty,
ROW_NUMBER() over (partition by child.idchild
order by power(child.x - parent.x, 2) + power(child.y - parent.y, 2)
) as seqnum
FROM child CROSS JOIN
parent
) pc
where seqnum = 1;
我从距离函数中删除了sqrt()
,因为在查找最小数字时没有必要。