首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL用最后一个值填补空白,直到出现新值。

SQL用最后一个值填补空白,直到出现新值。
EN

Stack Overflow用户
提问于 2015-12-14 16:55:19
回答 2查看 2.6K关注 0票数 2

我有一个在status列中有空白的数据集。这里类似的问题有遗漏的日期,但我的问题是日期。在本例中,我需要最新的状态来填补下面的空空白,直到出现新的状态,然后新的状态才需要填补空白。

例: 创建表#tableA ( “瓦古尔战役”(100) ,Date_of_data日期 ,状态变量(100) ) 插入#表A 值 (“班纳1”、“2015年2月11日”、“交付”) (“班纳1”、“2015年3月11日”、“交付”) (‘banner1 1’,'11/4/2015',空) (‘banner1 1’,'11/5/2015',空) (‘banner1 1’,'11/6/2015',空) (‘banner1 1’,'11/7/2015',空) (‘banner1 1’,'11/8/2015',空) (“班纳1”、“2015年9月11日”、“暂停”) (“班纳1”、“2015年10月11日”、“暂停”) (“班纳1”、“2015年11月11日”、“暂停”) (‘banner1 1’,'11/12/2015',空) (‘banner1 1’,'11/13/2015',空) (‘banner1 1’,'11/14/2015',空) (‘banner1 1’,'11/15/2015',空) (“班纳1”、“2015年11月16日”、“交付”) (“班纳1”、“2015年11月17日”、“交付”) (‘banner1 1’,'11/18/2015',‘交付’)从#tableA中选择*

11/3上的状态“传递”需要在11/4-11/8中填写,然后11/11 /11上的“暂停”状态需要在11/12-11/15中填写,因此最终数据集实际上是这样的。

Campaign|Date_of_data|Status banner1 2015-11-02交付 banner1 2015-11-03交付 banner1 2015-11-04交付 banner1 2015-11-05交付 banner1 2015-11-06交付 banner1 2015-11-07交付 banner1 2015-11-08交付 banner1 2015-11-09暂停 banner1 2015-11-10暂停 banner1 2015-11-11暂停 banner1 2015-11-12暂停 banner1 2015-11-13暂停 banner1 2015-11-14暂停 banner1 2015-11-15暂停 banner1 2015-11-16交付 banner1 2015-11-17交付 banner1 2015-11-18交付

谢谢!

第二种情况..。

下面的解决方案可以工作,但我遇到了一个新的场景。下面的工作为"banner1“,但当你得到"banner2”的记录11/12-11/15,不要充满‘准备’。他们满是“停顿”,我不知道为什么。这是订购问题吗?

期望的逻辑:用第一个“前一个”状态填充空记录

表# 创建表#表A ( “瓦古尔战役”(100) Date_of_data日期, 状态变量(100) )插入#表A。 值 (“班纳1”、“2015年2月11日”、“交付”) (“班纳1”、“2015年3月11日”、“交付”) (‘banner1 1’,'11/4/2015',空) (‘banner1 1’,'11/5/2015',空) (‘banner1 1’,'11/6/2015',空) (‘banner1 1’,'11/7/2015',空) (‘banner1 1’,'11/8/2015',空) (“班纳1”、“2015年9月11日”、“暂停”) (“班纳1”、“2015年10月11日”、“暂停”) (“班纳1”、“2015年11月11日”、“暂停”) (‘banner1 1’,'11/12/2015',空) (‘banner1 1’,'11/13/2015',空) (‘banner1 1’,'11/14/2015',空) (‘banner1 1’,'11/15/2015',空) (“班纳1”、“2015年11月16日”、“交付”) (“班纳1”、“2015年11月17日”、“交付”) (“班纳1”、“2015年11月18日”、“交付”) (“班纳2”、“2015年2月11日”、“送货”), (“班纳2”、“2015年3月11日”、“送货”) ('banner2','11/4/2015',空) ('banner2','11/5/2015',空) ('banner2','11/6/2015',空) ('banner2','11/7/2015',空) ('banner2','11/8/2015',空) (“横幅2”、“2015年9月11日”、“准备好”) (“银行2号”、“2015年10月11日”、“准备好”) (“银行2号”、“2015年11月11日”、“准备好”) (‘banner2 2’,'11/12/2015',空) (‘banner2 2’,'11/13/2015',空) (‘banner2 2’,'11/14/2015',空) (‘banner2 2’,'11/15/2015',空) (“班纳2”、“2015年11月16日”、“送货”), (“班纳2”、“2015年11月17日”、“送货”), (‘班纳2’,'11/18/2015',‘送货’)选择竞选,Date_of_data, 合并(状态,prevStatus)从#TableA到t1的状态 外部适用( 选择前1状态 从#TableA作为t2 其中t1.Date_of_data > t2.Date_of_data和Status不为空 由Date_of_data DESC)命令为t3(prevStatus) 1,2命令

EN

回答 2

Stack Overflow用户

发布于 2015-12-14 17:12:42

如果使用的是Server,则可以使用OUTER APPLY获得所需的结果

代码语言:javascript
复制
SELECT Campaign, Date_of_data, 
       COALESCE(Status, prevStatus) AS Status      
FROM #TableA AS t1
OUTER APPLY (
   SELECT TOP 1 Status
   FROM #TableA AS t2
   WHERE t1.Date_of_data > t2.Date_of_data AND Status IS NOT NULL
   ORDER BY Date_of_data DESC) AS t3(prevStatus)
ORDER BY Date_of_data

Demo here

票数 2
EN

Stack Overflow用户

发布于 2015-12-14 21:20:25

您可以使用两个窗口函数来完成这个任务。

从其中选择的查询使用窗口求和函数。当存在值时,IIF()函数将返回1,但否则将为零。随着Date_of_data的增加,窗口和将显示正在运行的总数。这实际上将为一个值创建一个分组,并且它是下面的空值。

用于返回数据的查询随后将使用该分组并显示第一个存在的值,根据定义,该值将是最后一个非空值。

代码语言:javascript
复制
SELECT
  Campaign,
  Date_of_data,
  Status,
  FIRST_VALUE(Status) OVER (
    PARTITION BY Grp
    ORDER BY Date_of_data ASC 
  )
FROM
  (
    SELECT 
      Campaign,
      Date_of_data,
      Status,
      SUM(IIF(Status IS NULL, 0,1)) OVER (ORDER BY Date_of_data ASC) AS 'Grp'
    FROM 
      #tableA
  ) A
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34272501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档