T-SQL - 插入特定时间段的缺失数据

Posted

技术标签:

【中文标题】T-SQL - 插入特定时间段的缺失数据【英文标题】:T-SQL - Insert Missing Data for Specific Period of Time 【发布时间】:2018-04-18 18:06:50 【问题描述】:

我无法解决这个问题,因为 4/13-4/15 的数据缺失。见截图:Daily Subscriber Counts

此截图由以下代码[编辑:部分]生成:

SELECT  
    MIN([AsOfDate]) AS StartDate,
    MAX([AsOfDate]) AS EndDate,
    SUM([TotalCustomers]) AS TotalSubs,
    SUM([HSDCustomers]) AS HSDSubs,
    SUM([PhoneCustomers]) AS PhoneSubs,
    SUM([VideoCustomers]) AS VideoSubs
FROM 
    [vDailyCustomerCounts]
WHERE
    Sourcesystem = 'ICOMS'
    AND (Asofdate BETWEEN '4/8/2018' AND '4/18/2018')
    AND iscommercial = 0
GROUP BY 
    [AsOfDate]
ORDER BY 
    [AsOfDate] DESC

基本上我的问题是我需要将“虚拟”数据插入到 select 语句中。我需要为 2018-04-13 到 2018-04-15 创建一行,并使用一般计数(如 502,900)或使用前一天的计数填充它。

理想情况下,我想创建如下所示的内容:

StartDate   End Date     TotalSubs
----------------------------------
2018-04-13  2018-04-13   502900

我只想在数据集中出现缺失日期的情况下插入此虚拟数据。我将非常感谢任何帮助!

【问题讨论】:

这些日期是否存在于您的数据中?或者,如果你有一个日期表,你可以加入它。 不,这些值根本不存在于任何表中。基本上,那几天有一项工作被卡住了,因此在解决基本问题之前,没有将数据填充到这些表中。现在我需要为那些日子创建行和一些通用值作为其他计算的占位符 毫无意义。如果您按 [AsOfDate] 分组,则 MIN([AsOfDate]) 和 MAX([AsOfDate]) 只是 [AsOfDate] 【参考方案1】:

使用这样的循环首先填写您缺少的日期 - 然后添加默认值并继续您的聚合

  declare @mindate datetime=(select min(Asofdate) from vDailyCustomerCounts)
  declare @maxdate datetime=(select max(Asofdate) from vDailyCustomerCounts)
  declare @date datetime=@mindate
  declare @missing table(datevalue datetime )
  while @date<@maxdate
  begin
  if @date not in (select Asofdate from vDailyCustomerCounts)
  insert @missing 
  select @date
  set @date=@date+1 
  end 


select a.datevalue, 
    b.TotalCustomers ,
    b.HSDCustomers ,
    b.PhoneCustomers,
    b.VideoCustomers 
from (select Asofdate from vDailyCustomerCounts  
union select * from @missing )a 
        left join vDailyCustomerCounts b on a.Asofdate =b.Asofdate 

【讨论】:

你好丹尼尔。感谢您的帮助,但我认为它要么不起作用,要么(并且)我对 SQL 没有很好的理解。代码运行了,但我没有注意到任何区别。如何自行查询 @missing 以查看其中是否填充了任何值? 抱歉错字 - 请参阅上面的编辑 - 让我知道这是否适合您 - 这应该返回您的最小和最大日期之间的所有日期的列表 - 然后您可以将此列表加入您的原始数据集并用您想要的任何数据填写原始集合中缺少的任何日期 添加的代码将为您提供一个新的原始数据集以供使用,其中包括您缺失日期的占位符 - 从那里相应地聚合 神圣的 **** 做到了!老实说,我(有点)理解它是如何工作的,但我自己从来没有想过它。你家教吗?我很想以某种方式与您取得联系。我觉得这样做(目前)真的超出了我的舒适区,而你做到了! 很乐意随时提供帮助 - 在linkedin上与我联系【参考方案2】:

查看此网页:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017

如果存在不需要的值,您可以在 SELECT 语句中使用 CASE 来选择一个虚拟值。

【讨论】:

以上是关于T-SQL - 插入特定时间段的缺失数据的主要内容,如果未能解决你的问题,请参考以下文章

插入后的 T-SQL 增量 ID

T-SQL - 使用按位运算查找缺失值[关闭]

sql T-SQL缺失索引

插入缺失日期/时间的行

T-SQL 查询将数据插入到具有可变列数的表中

Python pandas:在groupby数据框中插入缺失日期、时间序列的行