我尝试为该数据库中的所有相关时间戳创建一个数据透视表,但发现数据透视表的聚合语句中的 MAX() 函数返回了我不一定想要的值。我正在尝试跟踪时间戳以查看瓶颈和事件之间的平均时间。
对于该数据库,每个事件都有一条记录,并且每个事件都有时间戳。某些事件可以被“清除”,但这些事件也被记录为具有自己的时间戳的事件(它们被标记为“已清除”= 1 事件)。假设订单已完成,然后被清除 - 当我拉动该订单的 MAX(EventTimeStamp) 时,我将获得清除的时间戳,当我尝试查看数据时,这可能会产生误导。相反,我想返回 NULL 值。
原始数据如下:
案例 | 状态 | 事件时间戳 | 已清除 |
---|---|---|---|
1 | 订单已收到 | 2024-03-20 12:20 | 0 |
1 | 已完成 | 2024-03-20 12:51 | 0 |
1 | 已完成 | 2024-03-20 12:55 | 1 |
2 | 订单已收到 | 2024-03-21 10:00 | 0 |
2 | 已完成 | 2024-03-22 08:00 | 0 |
我想针对许多不同的情况跟踪可能有 25 种不同的状态,这就是为什么我将其旋转为如下所示
案例 | 订单已收到 | 已完成 |
---|---|---|
1 | 2024-03-20 12:20 | 2024-03-20 12:55 |
2 | 2024-03-21 10:00 | 2024-03-22 08:00 |
对于这些情况,我想要一张像这样的表格。由于最后一个已完成的事件是“已清除”事件,我希望它读取为 NULL:
案例 | 订单已收到 | 已完成 |
---|---|---|
1 | 2024-03-20 12:20 | 空 |
2 | 2024-03-21 10:00 | 2024-03-22 08:00 |
这是数据透视表的精简查询:
SELECT [CaseID]
,[OrderReceived]
,[Completed]
FROM (SELECT [CaseID]
,[Cleared]
,[State]
,[EventTimeStamp]
FROM CaseTracking
) AS SourceTable
PIVOT (
MAX(EventTimeStamp)
FOR [State] IN ([OrderReceived]
,[Completed])) AS PivotTable
说实话,我不知道该怎么做。我考虑过使用 CASE 语句与 MAX() 函数配对,但我不知道如何评估与 MAX(EventTimeStamp) 配对的 Cleared 变量。
我确实知道,用外行的话来说,我的条件语句是这样的: 如果 MAX(EventTimeStamp) 的“已清除”值 = 0,则返回 MAX(EventTimeStamp)。 如果 MAX(EventTimeStamp) 的“已清除”值 = 1,则返回 NULL。
任何指导将不胜感激!
我使用了 SQL Server - PIVOT on CASE statements 中的建议,并使用“1990-1-1”作为 NULL 的临时替代。
CREATE TABLE CaseTracking
(
[Case] VARCHAR(512),
[State] VARCHAR(512),
EventTimeStamp VARCHAR(512),
Cleared VARCHAR(512)
);
INSERT INTO CaseTracking ([Case], [State], EventTimeStamp, Cleared) VALUES
('1', 'OrderReceived', '2024-03-20 12:20', '0'),
('1', 'Completed', '2024-03-20 12:51', '0'),
('1', 'Completed', '2024-03-20 12:55', '1'),
('2', 'OrderReceived', '2024-03-21 10:00', '0'),
('2', 'Completed', '2024-03-22 08:00', '0');
SELECT * FROM CaseTracking
SELECT [CASE]
,MAX([OrderReceived]) as [OrderReceived]
,CASE MIN([Completed]) WHEN '1990-1-1' THEN NULL ELSE MIN([Completed]) END as [Completed]
FROM
(
SELECT [Case]
,[OrderReceived]
,[Completed]
FROM (SELECT [Case]
,[Cleared]
,[State]
,[EventTimeStamp]
,CASE [CLEARED] WHEN 1 THEN '1990-1-1' ELSE [EventTimeStamp] END as ets
FROM CaseTracking
) AS SourceTable
PIVOT (
MAX(ets)
FOR [State] IN ([OrderReceived]
,[Completed])) AS PivotTable
) t
GROUP BY [CASE]
案例 | 订单已收到 | 已完成 |
---|---|---|
1 | 2024-03-20 12:20 | 空 |
2 | 2024-03-21 10:00 | 2024-03-22 08:00 |