Sql server 使用sql将一个表转换为另一个表
我有下面的表1,我想把它转换成表2。该表由一系列属性和日期组成。有些记录有审核日期,有些记录可能没有。我想返回一个属性列表和所有相应的审核日期,审核日期中应该始终有一个显示为空的记录。最后,我想在最后一列中返回上一个审阅日期,这是该属性的其他记录上最近的审阅日期。请告知如何以有效的方式进行转换。多谢各位Sql server 使用sql将一个表转换为另一个表,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有下面的表1,我想把它转换成表2。该表由一系列属性和日期组成。有些记录有审核日期,有些记录可能没有。我想返回一个属性列表和所有相应的审核日期,审核日期中应该始终有一个显示为空的记录。最后,我想在最后一列中返回上一个审阅日期,这是该属性的其他记录上最近的审阅日期。请告知如何以有效的方式进行转换。多谢各位 CREATE TABLE Table1 (`Property` varchar(1), `ReviewDate` varchar(9), `Due` datetime) ; INSERT I
CREATE TABLE Table1
(`Property` varchar(1), `ReviewDate` varchar(9), `Due` datetime)
;
INSERT INTO Table1
(`Property`, `ReviewDate`, `Due`)
VALUES
('A', '1/31/2017', '2017-03-30 19:00:00'),
('A', '1/15/2016', '2016-03-30 19:00:00'),
('A', '1/10/2015', '2015-03-30 19:00:00'),
('B', NULL, '2017-03-30 19:00:00'),
('B', '1/15/2016', '2016-03-30 19:00:00'),
('B', '1/10/2015', '2015-03-30 19:00:00')
;
CREATE TABLE Table2
(`Property` varchar(1), `ReviewDate` varchar(9), `Due` datetime, `PreviousReviewDate` varchar(9))
;
INSERT INTO Table2
(`Property`, `ReviewDate`, `Due`, `PreviousReviewDate`)
VALUES
('A', NULL, NULL, '1/31/2017'),
('A', '1/31/2017', '2017-03-30 19:00:00', '1/15/2016'),
('A', '1/15/2016', '2016-03-30 19:00:00', '1/10/2015'),
('A', '1/10/2015', '2015-03-30 19:00:00', NULL),
('B', NULL, '2017-03-30 19:00:00', '1/15/2016'),
('B', '1/15/2016', '2016-03-30 19:00:00', '1/10/2015'),
('B', '1/10/2015', '2015-03-30 19:00:00', NULL)
;
自动联接+不等联接+分组方式 使用相同的
属性连接每一行
,并选择Max(ReviewDate)
(当前之前)以确定前一行
此解决方案符合标准SQL(Postgres、SqlServer等)
检查这个():
创建表表1
(属性varchar(1),审核日期,到期日期时间);
插入表1
(属性、审核日期、到期日)
价值观
(‘A’、‘2017年1月31日’、‘2017-03-30 19:00:00’),
(‘A’、‘2016年1月15日’、‘2016-03-30 19:00:00’),
(‘A’、‘2015年10月1日’、‘2015-03-30 19:00:00’),
('B',空,'2017-03-30 19:00:00'),
(‘B’、‘2016年1月15日’、‘2016-03-30 19:00:00’),
(‘B’、‘2015年10月1日’、‘2015-03-30 19:00:00’);
创建表2
(属性varchar(1),审核日期,到期日期时间,上一次审核日期);
插入表2(属性、审核日期、到期日、上一次审核日期)
选择具有合并关系的前1名(当前属性、上一属性)、当前审阅日期、当前到期日期、上一审阅日期作为上一审阅日期
从表1中取当前值
完全联接表1如前所示
ON Curr.Property=Prev.Property
和Prev.ReviewDate<合并(Curr.ReviewDate,GETDATE())
按行编号()排序(按当前属性划分,按当前审阅日期划分,按当前到期顺序按当前审阅日期描述划分)
在Property=Property和Date此外,我建议对这些日期字段使用
date
类型,而不是varchar
。始终提及您使用的数据库或软件的版本。这将帮助你得到更好的答案。您正在使用哪个版本的SQL Server。还可以用sql Server标记您的问题表2中的第一行是什么?('A',NULL,NULL,'1/31/2017'),为什么有这一行?我希望总是有一个没有审核日期的记录。把它想象成一个可接受的答案。嗨,如果答案是确定的,你能投票(一个或多个答案)并标记为解决你的首选答案吗。谢谢你和我。请考虑一下;-)从我的移动设备。。。但想法就在这里。我尝试格式化代码并对其进行更新,我重新格式化并重写了代码,我们对@zambonee的想法大致相同
CREATE TABLE Table1
(Property varchar(1), ReviewDate date, Due datetime)
;
INSERT INTO Table1
(Property, ReviewDate, Due)
VALUES
('A', '1/31/2017', '2017-03-30 19:00:00'),
('A', '1/15/2016', '2016-03-30 19:00:00'),
('A', '1/10/2015', '2015-03-30 19:00:00'),
('B', NULL, '2017-03-30 19:00:00'),
('B', '1/15/2016', '2016-03-30 19:00:00'),
('B', '1/10/2015', '2015-03-30 19:00:00')
;
Create Table2 as
Select
coalesce(A.Property,B.Property) as Property,
A.ReviewDate,
A.Due,
Max(B.ReviewDate) as PreviousReviewDate
From
Table1 A
full join Table1 B On
A.Property = B.Property and
A.ReviewDate > B.ReviewDate
group by
A.Property,A.ReviewDate,A.Due,B.Property
having
not(A.ReviewDate is null and Max(B.ReviewDate) is null)
CREATE TABLE Table1
(Property varchar(1), ReviewDate date, Due datetime);
INSERT INTO Table1
(Property, ReviewDate, Due)
VALUES
('A', '1/31/2017', '2017-03-30 19:00:00'),
('A', '1/15/2016', '2016-03-30 19:00:00'),
('A', '1/10/2015', '2015-03-30 19:00:00'),
('B', NULL, '2017-03-30 19:00:00'),
('B', '1/15/2016', '2016-03-30 19:00:00'),
('B', '1/10/2015', '2015-03-30 19:00:00');
CREATE TABLE Table2
(Property varchar(1), ReviewDate date, Due datetime, PreviousReviewDate date);
INSERT INTO Table2 (Property, ReviewDate, Due, PreviousReviewDate)
SELECT TOP 1 WITH TIES COALESCE(Curr.Property, Prev.Property), Curr.ReviewDate, Curr.Due, Prev.ReviewDate AS PreviousReviewDate
FROM Table1 AS Curr
FULL JOIN Table1 AS Prev
ON Curr.Property = Prev.Property
AND Prev.ReviewDate < COALESCE(Curr.ReviewDate, GETDATE())
ORDER BY ROW_NUMBER() OVER (PARTITION BY Curr.Property, Curr.ReviewDate, Curr.Due ORDER BY Prev.ReviewDate DESC)