如何重复列直到遇到下一个值

时间:2017-03-26 07:27:52

标签: sql sql-server

我想重复类别​​列,直到遇到下一个值。以下是表格的结构:

Category    Term      Date
-------------------- --------------
category1   a         12/7/2012
NULL        b         12/7/2012
NULL        c         12/7/2012
category2   a         13/7/2012
NULL        b         13/7/2012

期望的输出:

 Category    Term      Date
-------------------- --------------
category1   a         12/7/2012
category1   b         12/7/2012
category1   c         12/7/2012
category2   a         13/7/2012
category2   b         13/7/2012

我尝试使用LeadLag功能,但它无效。

2 个答案:

答案 0 :(得分:2)

首先,这种数据结构很糟糕。如果记录属于某个类别,则应在该记录中提及,而不必从结果集中的某些排序派生。

说到顺序:如果您没有客观的方法按列值排序记录,则无法承担订单。

在编辑问题时,您提供了一个额外的列Date,只要此日期唯一标识该类别,就可以生成所需的结果:

你可以写这个查询:

select max(category) over (partition by [Date]) as category,
       term
from   mytable;

这将产生所需的输出:

Category    Term
--------------------
category1    a
category1    b
category1    c
category2    a
category2    b

答案 1 :(得分:-1)

假设您的表具有按升序排序的Id列。 如果没有,您可以通过row_number()函数创建一个新的Id号。

        DECLARE @temps AS TABLE
        (
            Id int IDENTITY(1,1),
            Category varchar(30),
            Term varchar(10)
        )
        INSERT INTO  @temps VALUES ('category1', 'a')
        INSERT INTO @temps VALUES (NULL, 'b')
        INSERT INTO @temps VALUES (NULL, 'c')
        INSERT INTO @temps VALUES ('category2', 'a')
        INSERT INTO @temps VALUES (NULL, 'b')

        SELECT (
                    SELECT TOP 1 t2.Category 
                    FROM @temps t2 
                    WHERE t2.Id <= t.Id AND t2.Category IS NOT NULL 
                    ORDER BY t2.Id DESC
                ) AS Category,
        t.Term
        FROM @temps t