首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取空值的上一个值

如何获取空值的上一个值
EN

Stack Overflow用户
提问于 2013-05-21 20:07:13
回答 5查看 14.8K关注 0票数 16

我的表格中有以下数据。

代码语言:javascript
复制
   | Id  |  FeeModeId   |Name        |   Amount|
   ---------------------------------------------
   | 1   |  NULL        | NULL       |   20    |
   | 2   |  1           | Quarter-1  |   5000  |
   | 3   |  NULL        | NULL       |   2000  |    
   | 4   |  2           | Quarter-2  |   8000  |
   | 5   |  NULL        | NULL       |   5000  |
   | 6   |  NULL        | NULL       |   2000  |
   | 7   |  3           | Quarter-3  |   6000  |
   | 8   |  NULL        | NULL       |   4000  |

如何编写这样的查询以获得以下输出...

代码语言:javascript
复制
   | Id  |  FeeModeId   |Name        |   Amount|
   ---------------------------------------------
   | 1   |  NULL        | NULL       |   20    |
   | 2   |  1           | Quarter-1  |   5000  |
   | 3   |  1           | Quarter-1  |   2000  |    
   | 4   |  2           | Quarter-2  |   8000  |
   | 5   |  2           | Quarter-2  |   5000  |
   | 6   |  2           | Quarter-2  |   2000  |
   | 7   |  3           | Quarter-3  |   6000  |
   | 8   |  3           | Quarter-3  |   4000  |
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-21 20:43:21

请尝试:

代码语言:javascript
复制
select 
    a.ID,
    ISNULL(a.FeeModeId, x.FeeModeId) FeeModeId,
    ISNULL(a.Name, x.Name) Name,
    a.Amount
from tbl a
outer apply
(select top 1 FeeModeId, Name 
    from tbl b 
    where b.ID<a.ID and 
        b.Amount is not null and 
        b.FeeModeId is not null and 
        a.FeeModeId is null order by ID desc)x

代码语言:javascript
复制
select 
    ID,
    ISNULL(FeeModeId, bFeeModeId) FeeModeId,
    ISNULL(Name, bName) Name,
    Amount
From(
    select 
        a.ID , a.FeeModeId, a.Name, a.Amount, 
        b.ID bID, b.FeeModeId bFeeModeId, b.Name bName,
        MAX(b.FeeModeId) over (partition by a.ID) mx
    from tbl a left join tbl b on b.ID<a.ID
    and b.FeeModeId is not null
)x 
where bFeeModeId=mx or mx is null
票数 5
EN

Stack Overflow用户

发布于 2013-05-21 20:29:42

由于您使用的是SQL Server 2012...这是一个使用它的版本。它可能比其他解决方案更快,但您必须在您的数据上进行测试。

当列中有值时,sum() over()将按照Id添加1的顺序执行运行求和,并保留null值的当前值。然后使用计算出的运行和对first_value() over()中的结果进行分区。对于由运行和生成的每“组”行,Id排序的第一个值具有您想要的值。

代码语言:javascript
复制
select T.Id,
       first_value(T.FeeModeId) 
          over(partition by T.NF 
               order by T.Id 
               rows between unbounded preceding and current row) as FeeModeId,
       first_value(T.Name)      
          over(partition by T.NS 
               order by T.Id 
               rows between unbounded preceding and current row) as Name,
       T.Amount
from (
     select Id,
            FeeModeId,
            Name,
            Amount,
            sum(case when FeeModeId is null then 0 else 1 end) 
              over(order by Id) as NF,
            sum(case when Name is null then 0 else 1 end) 
              over(order by Id) as NS
     from YourTable
     ) as T

SQL Fiddle

适用于SQL Server 2012之前版本的功能:

代码语言:javascript
复制
select T1.Id,
       T3.FeeModeId,
       T2.Name,
       T1.Amount
from YourTable as T1
  outer apply (select top(1) Name
               from YourTable as T2
               where T1.Id >= T2.Id and
                     T2.Name is not null
               order by T2.Id desc) as T2
  outer apply (select top(1) FeeModeId
               from YourTable as T3
               where T1.Id >= T3.Id and
                     T3.FeeModeId is not null
               order by T3.Id desc) as T3

SQL Fiddle

票数 20
EN

Stack Overflow用户

发布于 2013-05-21 20:26:09

试试这个-

代码语言:javascript
复制
SELECT Id,
       CASE
         WHEN Feemodeid IS NOT NULL THEN
          Feemodeid
         ELSE
          (SELECT Feemodeid
             FROM Table_Name t_2
            WHERE t_2.Id = (SELECT MAX(Id)
                              FROM Table_Name t_3
                             WHERE t_3.Id < t_1.Id
                               AND Feemodeid IS NOT NULL))
        END Feemodeid,
       CASE
         WHEN NAME IS NOT NULL THEN
          NAME
         ELSE
          (SELECT NAME
             FROM Table_Name t_2
            WHERE t_2.Id = (SELECT MAX(Id)
                              FROM Table_Name t_3
                             WHERE t_3.Id < t_1.Id
                               AND NAME IS NOT NULL))
       END NAME,
       Amount
  FROM Table_Name t_1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16669620

复制
相关文章

相似问题

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