【问题标题】:Fill in missing timestamp values in SQL在 SQL 中填写缺失的时间戳值
【发布时间】:2019-03-08 14:21:26
【问题描述】:

SQL newby 在这里寻找编写查询的帮助。

一些样本数据

时间价值 9:00 1.2 9:01 2.3 9:05 2.4 9:06 2.5

我需要用零填充那些丢失的时间 - 这样查询就会返回

时间价值 9:00 1.2 9:01 2.3 9:02 0 9:03 0 9:04 0 9:05 2.4 9:06 2.5

这在 T-SQL 中可行吗?

感谢您的任何帮助/建议...

【问题讨论】:

  • 外连接一个包含所有时间的表或cte。
  • 在 SO 中搜索[tsql] missing values 可能是一个开始。与计数(又名数字)表连接是在 CTE 中生成值的替代方法。

标签: sql tsql datetime


【解决方案1】:

一种方法使用递归 CTE 生成时间列表,然后使用 left join 引入值:

with cte as (
      select min(s.time) as time, max(s.time) as maxt
      from sample s
      union all
      select dateadd(minute, 1, cte.time), cte.maxt
      from cte
      where cte.time < cte.maxt
     )
select cte.time, coalesce(s.value, 0)
from cte left join
     sample s
     on cte.time = s.time
order by cte.time;

请注意,如果您的时间超过 100 分钟,则在查询结束时需要option (maxrecursion 0)

【讨论】:

  • 是否定义了cte.time 列?
  • @KamilG。 . .现在有。谢谢。
【解决方案2】:

您可以尝试使用递归CTE制作日历表和OUTER JOIN基于此。

CREATE TABLE T(
  [Time] Time,
  Value float
);


insert into T values ('9:00',1.2);
insert into T values ('9:01',2.3);
insert into T values ('9:05',2.4);
insert into T values ('9:06',2.5);

查询 1

with cte as (
 SELECT MIN([Time]) minDt,MAX([Time] ) maxDt
 FROM T
 UNION ALL
 SELECT dateadd(minute, 1, minDt) ,maxDt
 FROM CTE
  WHERE dateadd(minute, 1, minDt) <= maxDt
)
SELECT t1.minDt 'Time',
       ISNULL(t2.[Value],0) 'Value'
FROM CTE t1 
LEFT JOIN T t2 on t2.[Time] = t1.minDt

Results

|             Time | Value |
|------------------|-------|
| 09:00:00.0000000 |   1.2 |
| 09:01:00.0000000 |   2.3 |
| 09:02:00.0000000 |     0 |
| 09:03:00.0000000 |     0 |
| 09:04:00.0000000 |     0 |
| 09:05:00.0000000 |   2.4 |
| 09:06:00.0000000 |   2.5 |

【讨论】:

  • 我喜欢这种方法。这使您能够设置填补所有空白所需的基础数据,然后与任何可用数据相结合。这就是我应该做的。
猜你喜欢
  • 2021-01-11
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2018-10-08
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多