我在Azure SQL数据库的表中有一系列数据点。绘制时,这些点具有以下分布:
我要做的是添加填充,使它们看起来像是一条连续的线 - 或者比现在更连续。
我尝试在每个点之间添加点,但问题在于它都是相对的。如果仔细观察,可以看到一些点是蓝色的,有些是暗红色的。蓝点是我添加的,但线看起来一样。
我正在寻找有关我应该用来解决这个问题的逻辑的建议。我想根据最近点之间的距离在每个数据点之间添加x个点...如果这是有道理的。
答案 0 :(得分:1)
我认为这有效
declare @t table (x smallmoney primary key, y smallmoney);
declare @inc smallmoney = 1;
insert into @t(x, y) values
(1, 1)
, (5, 3)
, (8, 4)
, (10, 5)
, (11, 6);
with cte as
( select x, x as x0, y, y as y0, cnt = cast(1 as smallmoney)
, lead(x) over (order by x) as nextX
, lead(y) over (order by x) as nextY
from @t t
union all
select x + @inc, x0, y + @inc/(nextX-x0)*(nextY-y0), y0, cnt+1, nextX, nextY
from cte t
where x + @inc < nextX
)
select *
from cte t
order by t.x;
答案 1 :(得分:0)
我不相信这是最好的解决方案,但我认为你可以建立起来。这是一个sqlfiddle
SELECT x + COALESCE(((nextx-x)/10)*inc, 0) as x, y + COALESCE(((nexty-y)/10)*inc, 0) as y
FROM
(SELECT x, y, nextx, nexty, inc.n + 0.0 as inc FROM
(SELECT x, y, lead(x) over (order by x) as nextx, lead(y) over (order by x) as nexty
FROM points) p inner join (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) inc(n)
ON nextx is not null or inc.n = 0
) a ORDER BY x
这将在每个点之间增加9个点(总共10个点,包括“真实”点)。
基本思想是我为每一行使用lead
来获取下一个x和下一个y,然后我将其加入到0到9的硬编码列表中。然后对于每个值,我增加x乘以nextx和x之差的1/10,并将y增加nexty和y之差的1/10。
连接条件nextx is not null or inc.n = 0
是我只将inc(0)加到最后一个x值(而不是加入10次)。
您可以更改我的硬编码值列表和硬编码10
以不同方式增加。同样,如果你只想要整数,你可能需要一些改变,但原理是相同的。