需要取最近的非空值
一、应用场景
节点字段可能是空值,且也会更新,需要取最近的非空值。需要对时间从大到小排列,但是可能最新时间那一行的节点值是空,比如实际的2022-03-20那一条空节点就不能当作最新节点,而是2022-03-12那一条的B节点 。所以需要使用concat(时间,节点),如果节点是空值,合并后的数据也是空值,降序排列会将其排到非空值后面,这样就实现空值排到后面;非空值先对时间进行排序,再使用聚合函数的first_value取第一个值。
二、数据集准备
1、sqlcmd创建test表
sqlcmd -S 192.168.118.129 -U sa //sqlcmd连接到mssql数据库 1> create database chenmu //创建chenmu数据库 2> go 1> use chenmu //使用chenmu数据库 2> go Changed database context to 'chenmu'. //切换到改数据库 1> create table test( 2> cate varchar(10), 3> test_date date, 4> node varchar(2) 5> ); 6> go //创建test表,如果输入错误可输入:RESET清空再重新输入 1> select * from test; //查询表数据 2> go cate test_date node ---------- ---------------- ---- (0 rows affected)
2、sqlcmd将数据导入表里
使用BULK INSERT来导入数据,text.txt数据如下,上传到/root下(因为mssql安装到linux下了)。
"cate","test_date","node
"实际","2022-02-15","A"
"实际","2022-02-22"
"实际","2022-03-12","B"
"实际","2022-03-20"
"目标","2022-01-10","B"
"目标","2022-02-23"
"目标","2022-03-05"
"目标","2022-03-20","C"
创建脚本文件test.sql如下,上传到/root下
BULK INSERT chenmu.dbo.test FROM '/root/test.txt' WITH ( FIELDTERMINATOR = ',', -- 定界符,例如逗号 ROWTERMINATOR = '\n', -- 行终止符,例如换行 FIRSTROW = 2 -- 如果 TXT 文件包含标题行,从第二行开始读取数据 );
执行sqlcmd命令将数据导入数据库,报错说文件不存在或者没有文件访问权限。
sqlcmd -S localhost -d chenmu -U sa -i /root/test.sql