【问题标题】:Sql Query to show the second row data into first row and third row data into second row and so on using sql querySql Query 使用 sql 查询将第二行数据显示到第一行,将第三行数据显示到第二行,依此类推
【发布时间】:2015-04-02 15:51:50
【问题描述】:

我的 sql server 中有一个表。该表只有一列。

示例表名:示例

列名:数据

数据

-----------
7/11/2014 12:00:00 AM

7/31/2014 12:00:00 AM

8/21/2014 12:00:00 AM

9/19/2014 12:00:00 AM

11/20/2014 12:00:00 AM

12/18/2014 12:00:00 AM

1/22/2015 12:00:00 AM

因此,我想通过这些数据添加一个额外的列,在该列中,我希望将第二行数据放入第一行,将第三行数据放入第二行……依此类推。

例子:

data                        New Column                                                                         

-----------                  ----------------------                                                                                      

7/11/2014 12:00:00 AM        7/31/2014 12:00:00 AM                                                                                               

7/31/2014 12:00:00 AM        8/21/2014 12:00:00 AM                                                                                              

8/21/2014 12:00:00 AM        9/19/2014 12:00:00 AM                                                                                              

9/19/2014 12:00:00 AM        11/20/2014 12:00:00 AM                                                                                                                                                                              

11/20/2014 12:00:00 AM       12/18/2014 12:00:00 AM                                                                                                                         

12/18/2014 12:00:00 AM       1/22/2015 12:00:00 AM                                                                                              

1/22/2015 12:00:00 AM        Null   

向我提供如何获得预期输出的建议。

【问题讨论】:

  • 表中是否有主键?
  • 获取数据后是否有理由不使用 php 或 python 等脚本语言执行此操作?

标签: mysql sql-server


【解决方案1】:

测试数据

DECLARE @Table TABLE (DateColumn DATETIME)

INSERT INTO @Table VALUES 
('7/11/2014 12:00:00 AM'),
('7/31/2014 12:00:00 AM'),
('8/21/2014 12:00:00 AM'),
('9/19/2014 12:00:00 AM'),
('11/20/2014 12:00:00 AM'),
('12/18/2014 12:00:00 AM'),
('1/22/2015 12:00:00 AM')

查询

;WITH CTE AS
(
 SELECT DateColumn
       ,ROW_NUMBER() OVER (ORDER BY DateColumn) rn  
 FROM @Table
 )
SELECT A.DateColumn AS DateColumn1
      ,B.DateColumn AS DateColumn2
FROM CTE A 
LEFT JOIN CTE B ON A.rn = B.rn - 1

结果

╔═════════════════════════╦═════════════════════════╗
║       DateColumn1       ║       DateColumn2       ║
╠═════════════════════════╬═════════════════════════╣
║ 2014-07-11 00:00:00.000 ║ 2014-07-31 00:00:00.000 ║
║ 2014-07-31 00:00:00.000 ║ 2014-08-21 00:00:00.000 ║
║ 2014-08-21 00:00:00.000 ║ 2014-09-19 00:00:00.000 ║
║ 2014-09-19 00:00:00.000 ║ 2014-11-20 00:00:00.000 ║
║ 2014-11-20 00:00:00.000 ║ 2014-12-18 00:00:00.000 ║
║ 2014-12-18 00:00:00.000 ║ 2015-01-22 00:00:00.000 ║
║ 2015-01-22 00:00:00.000 ║ NULL                    ║
╚═════════════════════════╩═════════════════════════╝

【讨论】:

  • 你能在下面的问题中给我建议吗?我得到了输出,但第一行是空值
  • 感谢您的回复
【解决方案2】:
DECLARE @Table TABLE (DateColumn DATETIME)

INSERT INTO @Table VALUES 
('7/11/2014 12:00:00 AM'),
('7/31/2014 12:00:00 AM'),
('8/21/2014 12:00:00 AM'),
('9/19/2014 12:00:00 AM'),
('11/20/2014 12:00:00 AM'),
('12/18/2014 12:00:00 AM'),
('1/22/2015 12:00:00 AM')

;WITH CTE AS (
select DateColumn,ROW_NUMBER()OVER (ORDER BY DATECOLUMN)RN from @Table
)
select  DATECOLUMN,  DATECOLUMN  As NewColumn from CTE WHERE RN  > 1
UNION ALL 
select  DATECOLUMN,CASE WHEN RN = 1 then NULL ELSE ' ' END  As NewColumn 
from CTE  WHERE RN  = 1 
ORDER BY DATECOLUMN 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 2018-08-22
    • 2014-12-01
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多