Pivot SQL查询中的最后一个非空

时间:2013-01-15 20:28:05

标签: sql sql-server sql-server-2008-r2 pivot

我有下表w / data: enter image description here

我有以下sql查询来操作数据,使用相同的unix_timestamp对所有数据进行分组以使用图形api(时间轴):

select * from 
                (
                    select unix_timestamp, date_time, input_raw, tag_id 
                    from [200030].[dbo].inputs
                    WHERE inputs.date_time > dateadd(day,-1,getdate())
                    AND
                    (tag_id = 92084 OR tag_id = 92106 OR tag_id = 92127 OR tag_id = 92149 OR tag_id = 92164 OR tag_id = 92193 OR tag_id = 92215)
                ) src
                pivot
                (
                    max(input_raw)
                    for tag_id in ([92084], [92106], [92127], [92149], [92164], [92193], [92215])
                ) piv
                ORDER by unix_timestamp DESC

它给了我这些结果(编号的列名来自原始表的tag_id字段:

enter image description here

这很好接受我在查询中还需要一件事。我需要在编号列下的条目是最后一个非Null值。除非之前没有非Null。例如,列92149下的第4-8行需要是294而不是Null。

和建议?

由于

1 个答案:

答案 0 :(得分:1)

问题基本上是你在时间戳上“丢失”了数据,因为一次只有一个标签进来。一种方法是填写缺失的数据。

此查询获取时间戳和标记的所有组合,然后在枢轴之前获取最新的input_raw值。该查询使用相关的子查询。

                select unix_timestamp, date_time, tag_id,
                       coalesce(input_raw,
                                (select top 1 input_raw
                                 from inputs i
                                 where i.tag_id = tags.tag_id and
                                       i.unix_timestamp < tags.unix_timestamp
                                 order by unix_timestamp
                                )
                               ) as input_raw
                from (select 92084 as tag_id union all
                      select 92106 union all select 92127 union all select 92149 union all
                      select 92164 union all select 92193 union all select 92215
                     ) tags cross join
                     (select distinct unix_timestamp, datetime, input_raw
                      from [200030].[dbo].inputs
                      WHERE inputs.date_time > dateadd(day,-1,getdate())
                     ) t left outer join
                     [200030].[dbo].inputs i
                     on i.tag_id = tags.tag_id and
                        i.unix_timestamp = tags.unix_timestamp and
                        i.datetime = tags.datetime
                WHERE inputs.date_time > dateadd(day,-1,getdate())

这将取代您的内部子查询。