T-SQL - 填充数据点

时间:2018-02-28 16:17:54

标签: tsql azure-sql-database sql-server-2016

我在Azure SQL数据库的表中有一系列数据点。绘制时,这些点具有以下分布:

enter image description here

我要做的是添加填充,使它们看起来像是一条连续的线 - 或者比现在更连续。

我尝试在每个点之间添加点,但问题在于它都是相对的。如果仔细观察,可以看到一些点是蓝色的,有些是暗红色的。蓝点是我添加的,但线看起来一样。

我正在寻找有关我应该用来解决这个问题的逻辑的建议。我想根据最近点之间的距离在每个数据点之间添加x个点...如果这是有道理的。

2 个答案:

答案 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以不同方式增加。同样,如果你只想要整数,你可能需要一些改变,但原理是相同的。