当前位置: 首页 > 面试题库 >

如何填补空白?

张晨朗
2023-03-14
问题内容

假设我有两条记录,都有日期和计数:

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-16 00:00:00        8

您将如何选择此项以填补时间空白,并始终保持最近的记录?

因此输出将是:

--Date--                   --Count--
2011-09-20 00:00:00        5
2011-09-19 00:00:00        8
2011-09-18 00:00:00        8
2011-09-17 00:00:00        8
2011-09-16 00:00:00        8

我还没有找到一个整齐的解决方案。我想可以使用DATEDIFF和for循环来完成此操作,但我希望可以更轻松地完成此操作。


问题答案:

您有2个要解决的问题。第一个问题是如何填补空白。第二个问题是为那些缺少的记录填充“计数”字段。

问题1:这可以通过使用Dates Lookup table或创建一个来解决recursive common table expression。如果可以的话,我建议为此创建一个“日期查询”表。如果您不能创建这样的表,那么您将需要这样的东西。

WITH CTE AS (
  SELECT MAX(dt) maxdate, MIN(dt) mindate
  FROM yourtable
  ),
RecursiveCTE AS (
  SELECT mindate dtfield
  FROM CTE
  UNION ALL
  SELECT DATEADD(day, 1, dtfield)
  FROM RecursiveCTE R 
    JOIN CTE T
      ON R.dtfield < T.maxdate
  )

这将为您创建一个日期列表,该MIN日期列表从表中的日期开始,以结束MAX

问题2:在这里可以correlated subquery派上用场(就像我通常在远离它们的地方一样),可以从原始表中获取最后一个cnt:

SELECT r.dtfield, 
   (SELECT TOP 1 cnt
    FROM yourtable 
    WHERE dt <= r.dtfield 
    ORDER BY dt DESC) cnt
FROM RecursiveCTE r
  • SQL小提琴演示


 类似资料:
  • 问题内容: 我有一个带有IDENTITY列的表 在添加/删除了beeing的某些行之后,我以Id值的间隔结尾: 有没有一种简单的方法可以将值压缩为 ? 问题答案: 我认为用相同的模式创建第二张表,从第一张表导入所有数据(当然,除了identity列;让第二张表开始重新编号),然后删除第一张表并将第二张表重命名为原始名称。 如果您有大量的FK关系要与其他表等一起重建,是否容易成为问题。

  • 问题内容: 我想修改一个熊猫MultiIndex DataFrame,以使每个索引组都包括指定范围之间的日期。我希望每个小组使用值0(或)填写缺少的日期2013-06-11至2013-12-31 。 我已经看到了有关ing的一些讨论,但这是针对简单(非分组)时间序列数据的。 是否有捷径可寻? 以下是我为实现此目的所做的一些尝试。例如:通过堆叠后,我便可以重新索引。 最后几行让我有些难过。我希望我可

  • 我正在创建一个战舰游戏应用程序来学习OOP,Java。我想显示一个“空海”供玩家参考放置他们的舰队。下面是我的游戏板课的开始: 我把这叫做主要的:

  • 我有一个非常类似的场景,如这个线程所示:复制记录组来填补谷歌BigQuery中的多个日期空白 我使用的查询如下: 我注意到一件事,对我的场景来说并不理想,那就是每个产品的日期,合作伙伴组合并不总是从2010年开始,这就是我想要的。 因此,每个产品合作伙伴的输出日期应在[2010、2011、2012、2013、2014、2015、2016、2017、2018、2019]范围内 此查询返回的输出为:

  • 问题内容: 我想用空格填充字符串。我知道以下内容适用于零: 但是,当我想要这个时我该怎么办?: 当然,我可以测量字符串的长度并这样做,但是我想用最短的方法。 问题答案: 你可以使用 返回长度为的左对齐字符串。使用指定的fillchar填充(默认为空格)。如果小于,则返回原始字符串。

  • 问题内容: 我有一个大查询表,看起来像这样:![Table [(https://ibb.co/1ZXMH71)如您所见,大多数值都是空的。我想向前填充这些空值,这意味着使用按时间排序的最后一个已知值。 显然,有一个名为FILL的函数但是我不知道如何使用它。 这是我尝试过发布到Web UI的查询: 我得到的错误是:语法错误:[3:6]处出现意外的标识符“ sns_6”,我想要的是获取一个新表,其中s