用给定分区中以前的非空值替换空值

gorkyyrv  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(334)

如何计算新列在哪里 NULL 值来自 Number 列是否将替换为以前的非空列?不是 NULL 那些应该保持不变。全部在分区内 Customer .

  1. +----------+------------+--------+
  2. | Customer | Date | Number |
  3. +----------+------------+--------+
  4. | A | 2016-01-01 | 9,00 |
  5. | A | 2020-01-01 | NULL |
  6. | A | 2020-01-15 | 10,00 |
  7. | A | 2020-02-01 | NULL |
  8. | A | 2020-03-01 | NULL |
  9. | A | 2020-03-15 | 11,00 |
  10. | A | 2020-04-01 | NULL |
  11. | B | 2016-01-01 | 9,00 |
  12. | B | 2020-01-01 | NULL |
  13. | B | 2020-01-15 | 10,00 |
  14. | B | 2020-02-01 | NULL |
  15. | B | 2020-03-01 | NULL |
  16. | B | 2020-03-15 | 11,00 |
  17. | B | 2020-04-01 | NULL |
  18. +----------+------------+--------+

假设:
输入数据为 ORDER BY Customer, Date ,输出也应如此
第一排(最老的一排) Customer 永远都有 Number 不同于 NULL

cedebl8k

cedebl8k1#

如果支持sql server,这将更容易 lag(ignore nulls) . 但事实并非如此。您可以通过对具有值的行进行累计计数,然后分散这些值来定义组:

  1. select t.*,
  2. max(number) over (partition by customer, grp)
  3. from (select t.*, count(number) over (partition by customer order by date) as grp
  4. from t
  5. ) t;

你也可以用 apply ,但我怀疑在几乎所有情况下,上述方法都更快。

hxzsmxv2

hxzsmxv22#

  1. SELECT customer ,[date] ,case when number is null then B.number else t.number end number
  2. FROM yourTable t
  3. CROSS APPLY (
  4. SELECT TOP 1 number
  5. FROM yourTable
  6. WHERE customer = t.customer
  7. AND number IS NOT NULL
  8. ORDER BY DATE DESC
  9. ) B

相关问题