如何将现有列的第一行填充到第二行的新列中?

时间:2012-03-09 10:09:52

标签: sql

我有一个生成以下输出的查询:

| columnA |
-----------
|       5 |
-----------
|       2 |
-----------
|       3 |
-----------
|       4 |
-----------

是否有一个解决方案,我可以生成另一个列与columnA完全相同(让我们为它命名 - columnB),并从columnA向下移动的值。以下是期望的输出:

| columnA | columnB |
---------------------
|       5 |       0 | -> put zero for 1st row
---------------------
|       2 |       5 | -> original value from 1st row of columnA
---------------------
|       3 |       2 | -> original value from 2nd row of columnA
---------------------
|       4 |       3 | -> original value from 3rd row of columnA
---------------------

这是关于我的问题。

2 个答案:

答案 0 :(得分:2)

IN PL / SQL:

-- this gets just the first line
select A A1, null A2 from
    (select A from TABLE)
where rownum = 1
union all
-- this gets the rest of the lines
select Q1.A A1, Q2.A A2 from
    (select A, rownum RN from (select A from TABLE)) Q1    
    join
    (select A, rownum RN from (select A from TABLE)) Q2
    on Q1.RN = Q2.RN + 1

(从TABLE中选择A)是提供原始列表的内部查询。经过测试并做你想做的事。可能应该以某种方式对多次出现的查询进行别名,但我不知道如何做到这一点。

您也可以替换

(select A, rownum RN from (select A from TABLE))

(select A, rownum RN from TABLE))

如果您不介意修改原始查询。

答案 1 :(得分:1)

在Transact SQL中:

       WITH main AS (SELECT ROW_NUMBER() OVER (ORDER BY ColumnA ASC) as rownum, 
                             ColumnA 
                        FROM MainQuery)

     SELECT ISNULL(parent.ColumnA,0) as ColumnA,  
            ISNULL(child.ColumnA,0) as ColumnB 
       FROM main parent FULL OUTER JOIN main child
         ON parent.rownum = child.rownum + 1

将“MainQuery”替换为生成原始columnA的查询。

这会产生零,其中两列不重叠(即第一行和最后一行)。正如骰子和马克班尼斯特所提到的那样,如果没有某种排序,排位是毫无意义的。这是由

捕获的
ROW_NUMBER() OVER (ORDER BY ColumnA ASC)

需要将其更改为您希望如何订购数据。