我有一个在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命令
发布于 2015-12-14 17:12:42
如果使用的是Server,则可以使用OUTER APPLY获得所需的结果
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_dataDemo here
发布于 2015-12-14 21:20:25
您可以使用两个窗口函数来完成这个任务。
从其中选择的查询使用窗口求和函数。当存在值时,IIF()函数将返回1,但否则将为零。随着Date_of_data的增加,窗口和将显示正在运行的总数。这实际上将为一个值创建一个分组,并且它是下面的空值。
用于返回数据的查询随后将使用该分组并显示第一个存在的值,根据定义,该值将是最后一个非空值。
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
) Ahttps://stackoverflow.com/questions/34272501
复制相似问题