Sql server 如何使用递归CTE向数据集添加分辨率

Sql server 如何使用递归CTE向数据集添加分辨率,sql-server,recursive-cte,Sql Server,Recursive Cte,我试图创建一个递归CTE语句,在数据点之间添加空行,稍后将用于插值。我是SQL的初学者,这是我第一次使用CTE,我很难找到正确的方法 在做了一些研究之后,我尝试对下面提供的代码进行一些不同的细微修改,但还没有完全理解我的问题。以下代码应通过每4小时从样本数据集中进行一次观测来模拟稀疏采样,第二部分应每0.1小时添加具有相应x值的行,该行随后将填充从三次样条曲线导出的插值 -样本数据 create table #temperatures (hour integer, temperature dou

我试图创建一个递归CTE语句,在数据点之间添加空行,稍后将用于插值。我是SQL的初学者,这是我第一次使用CTE,我很难找到正确的方法

在做了一些研究之后,我尝试对下面提供的代码进行一些不同的细微修改,但还没有完全理解我的问题。以下代码应通过每4小时从样本数据集中进行一次观测来模拟稀疏采样,第二部分应每0.1小时添加具有相应x值的行,该行随后将填充从三次样条曲线导出的插值

-样本数据

create table #temperatures (hour integer, temperature double precision);
insert into #temperatures (hour, temperature) values
(0,18.5),
(1,16.9),
(2,15.3),
(3,14.1),
(4,13.8),
(5,14.7),
(6,14.7),
(7,13.5),
(8,12.2),
(9,11.4),
(10,10.9),
(11,10.5),
(12,12.3),
(13,16.4),
(14,22.3),
(15,27.2),
(16,31.1),
(17,34),
(18,35.6),
(19,33.1),
(20,25.1),
(21,21.3),
(22,22.3),
(23,20.3),
(24,18.4),
(25,16.8),
(26,15.6),
(27,15.4),
(28,14.7),
(29,14.1),
(30,14.2),
(31,14),
(32,13.9),
(33,13.9),
(34,13.6),
(35,13.1),
(36,15),
(37,18.2),
(38,21.8),
(39,24.1),
(40,25.7),
(41,29.9),
(42,28.9),
(43,31.7),
(44,29.4),
(45,30.7),
(46,29.9),
(47,27);
-一,

-二,


使用-1中生产的温度表xy,以下将为您提供一个x系列:

;with x_series(input_x)
as
(
    select min(x) AS input_x
    from #xy
    union all
    select input_x + 0.1
    from x_series
    where input_x + 0.1 < (select max(x) from #xy)
)
SELECT * FROM x_series;

我认为这里不需要递归CTE。我认为这样的解决办法会更好。相应地修改

DECLARE @max_value FLOAT = 
    (SELECT MAX(hour) FROM  #temperatures) * 10

INSERT INTO #temperatures (hour, temperature)
SELECT X.N / 10, NULL
FROM (
    select CAST(ROW_NUMBER() over(order by t1.number) AS FLOAT) AS N
    from   master..spt_values t1 
           cross join master..spt_values t2
) X
WHERE X.N <= @max_value
    AND X.N NOT IN (SELECT hour FROM #temperatures)

我想你不需要

那么这个呢:

这是基于你提到的两天

输出

你甚至不需要临时表格

SELECT DISTINCT n = number *1.0 /10 , #temperatures.temperature
FROM master..[spt_values] step
LEFT JOIN #temperatures
  ON step.number *1.0 / 10  = #temperatures.hour
 AND  #temperatures.hour % 4 = 0
WHERE number BETWEEN 40 AND 480;

对不起,Juan我可以提供示例数据和预期输出,当您说db schema时,您的意思是什么?为您的表创建表,因此我们知道数据类型、主键、索引。感谢提示,进行这些调整。请澄清顺序是4.1、4.2、4.3。。。4.9,5.0,5.1, .... 7.9,8.0?您还可以使用x_系列左连接xy以获得x,y结果。您不能在递归中使用聚合函数cte@JuanCarlosOropeza你是对的。虽然我可以在cte之前将minx和maxx放入变量中,但它也可以超过100个递归限制。所以递归cte可能不是一个好的解决方案。你需要xy,y温度
;with x_series(input_x)
as
(
    select min(x) AS input_x
    from #xy
    union all
    select input_x + 0.1
    from x_series
    where input_x + 0.1 < (select max(x) from #xy)
)
SELECT * FROM x_series;
DECLARE @max_value FLOAT = 
    (SELECT MAX(hour) FROM  #temperatures) * 10

INSERT INTO #temperatures (hour, temperature)
SELECT X.N / 10, NULL
FROM (
    select CAST(ROW_NUMBER() over(order by t1.number) AS FLOAT) AS N
    from   master..spt_values t1 
           cross join master..spt_values t2
) X
WHERE X.N <= @max_value
    AND X.N NOT IN (SELECT hour FROM #temperatures)
SELECT DISTINCT n = number *1.0 /10 , #xy.x, #xy.y
FROM master..[spt_values] step
LEFT JOIN #xy
  ON step.number*1.0 /10  = #xy.x
WHERE number BETWEEN 40 AND 480
SELECT DISTINCT n = number *1.0 /10 , #temperatures.temperature
FROM master..[spt_values] step
LEFT JOIN #temperatures
  ON step.number *1.0 / 10  = #temperatures.hour
 AND  #temperatures.hour % 4 = 0
WHERE number BETWEEN 40 AND 480;