【问题标题】:Fill in missing values over period by groups按组填写一段时间内的缺失值
【发布时间】:2016-09-12 09:39:27
【问题描述】:

您好,我有以下数据集,其中包含日期(始终从 2015-01 到 2016-05 期间)以及帐户和价值(每个帐户的期间都将是 2015-01 到 2016-05)。

Date        Account    Value    
2015-05-01  Null       0
2015-06-01  Null       0  
2015-07-01  Null       0
2015-08-01  Null       0
2015-09-01  Null       0
2015-10-01  100        50
2015-11-01  Null       0 
2015-12-01  Null       0
2016-01-01  Null       0
2016-02-01  100        80  
2016-03-01  Null       0
2016-04-01  100        100
2016-05-01  Null       0
2015-05-01  200        200
2015-06-01  Null       0  
2015-07-01  Null       0
2015-08-01  Null       0
2015-09-01  Null       0
2015-10-01  200        50
2015-11-01  Null       0 
2015-12-01  Null       0
2016-01-01  Null       0
2016-02-01  200        80  
2016-03-01  Null       0
2016-04-01  200        100
2016-05-01  Null       0

我想填写 Null 和 0,以便在 2015 年 1 月至 2016 年 5 月期间出现相同的帐户编号(请参见下表)。我还想更改该值,以便在有可用值(如帐户 200)或下一个值(如帐户 100)时填充上一个值

Date        Account    Value    
2015-05-01  100        50
2015-06-01  100        50  
2015-07-01  100        50
2015-08-01  100        50
2015-09-01  100        50
2015-10-01  100        50
2015-11-01  100        50 
2015-12-01  100        50
2016-01-01  100        50
2016-02-01  100        80  
2016-03-01  100        80
2016-04-01  100        100
2016-05-01  100        100
2015-05-01  200        200
2015-06-01  200        200
2015-07-01  200        200
2015-08-01  200        200
2015-09-01  200        200
2015-10-01  200        50
2015-11-01  200        50
2015-12-01  200        50
2016-01-01  200        50
2016-02-01  200        80  
2016-03-01  200        80  
2016-04-01  200        100
2016-05-01  200        100

任何帮助将不胜感激!

【问题讨论】:

  • 您将数据呈现为好像有订单一样,而实际上记录实际上是无序存储在数据库中的。是否有一个实际的列可以强加您向我们展示的顺序?
  • 账户从小到大排序,每个账户都分配了2015-01到2016-05的日期。除此之外,没有指示顺序的顺序或列(希望我正确理解了您的问题?)

标签: sql sql-server missing-data


【解决方案1】:

编辑:当表名是“test_account”并且我将列重命名为 date_month、account_id 和 value_account 时,这应该适用于您的输入数据。

表格中的日期是从 1.5.2015 到 1.5.2016 的日期,如您的示例所示

with date_intervals as 
(
select a.*,
nvl(lag(date_month) over (partition by account_id order by date_month     asc),'01.01.1999') as start_date,
lead(date_month) over (partition by account_id order by date_month asc)     as end_date
from  test_account a 
where account_id is not null
)
select a.date_month,b.account_id,b.value_account 
from dates a 
join     date_intervals b on (a.date_month>b.start_date and     a.date_month<=b.date_month) 
or (a.date_month>b.date_month and end_date is null)

【讨论】:

  • 很遗憾,除了帐户,我没有其他形式的 ID。是否可以使用行号来查看每个帐户的时间段是恒定的(因此每个帐户的行数是恒定的?)
  • 如果您知道每个帐户都有相同的时间段,我建议您重新创建您的表格。仅选择 account 和 value 不为空的那些行,您可以从这些行中通过在带有句点的虚拟表上交叉连接来重新创建整个表。
  • 你能用一个简短的例子来说明一下吗?如果我理解正确,这就是我最初所做的,因此我最终得到了 NULL 字段
  • 非常感谢!!它100%有效!我在 SQL Server 中工作,所以我只是用 ISNULL 函数替换了 NVL 函数,但除此之外它完美无缺!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2018-07-15
  • 2019-03-08
  • 2018-12-22
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多