【发布时间】:2018-08-07 05:54:48
【问题描述】:
我有一张车辆登记表,如下所示:
CREATE TABLE [registrations]
(
[VIN] int,
[Name] nvarchar(255),
[Action] nvarchar(255),
[Date] DateTime
);
INSERT INTO registrations VALUES
(1, 'John', 'Add', '2017-01-01'),
(1, '', 'Remove', '2017-01-16'),
(1, 'Fred', 'Add', '2017-02-25'),
(1, 'Tom', 'Change', '2017-06-08'),
(2, 'Nancy', 'Add', '2018-01-15'),
(2, 'Jim', 'Change', '2018-02-05'),
(3, 'Clarence', 'Add', '2018-02-10'),
(3, 'Darlene', 'Change', '2018-02-11'),
(4, 'Charlotte', 'Add', '2018-02-11'),
(5, 'Ferris', 'Add', '2018-02-12'),
(5, 'Dante', 'Change', '2018-02-12'),
(5, 'Susan', 'Change', '2018-02-13');
我试图仅捕获动作 Change,但我希望将更改前后的 Name 值作为同一行中的不同列。
所以上面的查询会返回如下内容:
VIN OldName NewName Date
1 Fred Tom 2017-02-25
2 Nancy Jim 2018-02-05
3 Clarence Darlene 2018-02-11
5 Dante Susan 2018-02-13
注意:我排除了只有 1 笔交易的 VIN,Change 可以来自多个状态(例如 Add)。
其他答案 (1) 显示了一个很好的方法,但通过监控单个列的变化。我有多个列正在更改(Name 只是其中的一个示例),其中一个标志列 (Action) 表示对任何行进行了更改。
我可以使用另一个答案 (2) 的指导将其转换为看起来像日志的可用格式:
WITH T AS
(
SELECT *, COUNT(*) OVER (PARTITION BY VIN) as Cnt
FROM [registrations]
)
SELECT [VIN], [Action], [Name], [Date]
FROM T
WHERE Cnt > 1
order by [VIN], [Date] desc
但就PIVOTing 而言,我不确定如何考虑每个VIN 可能有2 个或10 个条目的事实。我只想要最近的两个(最近的是Change)。
我能够在应用程序级别对上述查询进行额外处理,但我想知道如何在 SQL 中执行此操作。
RDBMS:MS SQL Server 2005
SQLFiddle:http://sqlfiddle.com/#!18/f579f/1
【问题讨论】:
标签: sql sql-server sql-server-2005