Sql 将多行合并为一行,数据分为两列
我有以下方式的sql表:Sql 将多行合并为一行,数据分为两列,sql,sql-server-2008,Sql,Sql Server 2008,我有以下方式的sql表: Table_Name Field_Name New_Value Create_Date TableTest Loading Hours 25 12/12/2015 2:56:26 p.m. TableTest Loading Hours 15 12/12/2015 2:30:23 p.m. TableTest Loading Hours 11 12
Table_Name Field_Name New_Value Create_Date
TableTest Loading Hours 25 12/12/2015 2:56:26 p.m.
TableTest Loading Hours 15 12/12/2015 2:30:23 p.m.
TableTest Loading Hours 11 12/12/2015 2:09:42 p.m.
TableTest Loading_Percentage 35.8 12/12/2015 2:56:26 p.m.
TableTest Loading_Percentage 15.5 12/12/2015 2:30:23 p.m.
我想做的是能够转换上述内容,我如何才能最有效地做到这一点?我可能会在上表中的加载时间中有更多的值,这需要在逻辑上显示,如下面转换的数据所示
TableTest Field_Name OldValue NewValue DateTime
TableTest Loading Hours 15 25 12/12/2015 2:56:26 p.m.
TableTest Loading Hours 11 15 12/12/2015 2:30:23 p.m.
TableTest Loading Hours NULL 11 12/12/2015 2:09:42 p.m.
TableTest Loading_Percentage 15.5 35.8 12/12/2015 2:56:26 p.m.
TableTest Loading_Percentage NULL 15.5 12/12/2015 2:30:23 p.m.
提前谢谢你的帮助
干杯您的场景正是
lag
窗口功能的设计目标。不幸的是,lag
在SQL Server 2008中不可用。在升级之前,您可以执行以下操作:
with cte as (
select *,
row_number() over (partition by table_name, field_name order by create_date) as rn
from tbl
)
select curr.table_name,
curr.field_name,
prev.new_value as old_value,
curr.new_value,
curr.create_date
from cte curr
left join cte prev
on prev.table_name = curr.table_name
and prev.field_name = curr.field_name
on prev.rn = curr.rn + 1
order by curr.table_name, curr.field_name, curr.rn desc
如果您升级到SQL Server 2012+,则可以通过使用lag
,更简单地编写查询,并大大提高性能:
select table_name,
field_name,
lag(new_value) over (partition by table_name, field_name order by create_date) as old_value,
new_value,
create_date
from tbl
order by table_name, field_name, create_date desc
在触发器中处理此场景。为表添加Insert和Update触发器,并使用该触发器实现所需的功能。
在向表中插入/更新数据时,触发器应根据字段名称获取最后一次插入/更新的值,并插入一条具有新旧值的新记录。指示转换的逻辑是什么?谢谢,这是正确的。如果在某个时候迁移到sql 2012,我将更新脚本+