如何解决返回一个列,该列显示记录表中每行 ID 的最后一个已知值 (MAX DateTime) - SQL
我知道以前有人问过类似的问题,我会在底部包含一些链接,但我的查询无法解决。
我想在一个视图中计算 2 列,返回一个人的每行最后一个已知状态(状态 A 和状态 B)(状态变化 DateTime
)。
我在 date_time
上加入了两个记录表,其中包含有关人员状态随时间变化的信息。我想知道状态 B 更改时某人的状态 A 的最新值,反之亦然。例如,当一个人的状态从饥饿变为悲伤时,他们最近(或当前)的状态 B(活跃?)是什么。
日期时间 | ID | StatusA_Old | StatusA_New | StatusB_Old | StatusB_New |
---|---|---|---|---|---|
2021-02-01 23:57:20.000 | 1001 | NULL | 饿了 | NULL | 活跃 |
2021-02-02 23:57:20.000 | 1002 | NULL | 伤心 | NULL | 活跃 |
2021-02-03 23:57:20.000 | 1001 | 饿了 | 开心 | NULL | NULL |
2021-02-04 23:57:20.000 | 1002 | NULL | NULL | 活跃 | 无效 |
我想返回一个表:
日期时间 | ID | StatusA_Old | StatusA_New | StatusA_Current | StatusB_Old | StatusB_New | StatusB_Current |
---|---|---|---|---|---|---|---|
2021-02-01 23:57:20.000 | 1001 | NULL | 饿了 | 饿了 | NULL | 活跃 | 活跃 |
2021-02-02 23:57:20.000 | 1002 | NULL | 伤心 | 伤心 | NULL | 活跃 | 活跃 |
2021-02-03 23:57:20.000 | 1001 | 饿了 | 开心 | 开心 | NULL | NULL | 活跃 |
2021-02-04 23:57:20.000 | 1002 | NULL | NULL | 伤心 | 活跃 | 无效 | 无效 |
我尝试了什么?
我大约有 7 次尝试使用子查询和/或重新连接表以返回两个原始表的 MAX(DateTime) 处的 StatusA_New/StatusB_New 的值。
我去过的最接近的可能是这个:
WITH T AS
(
SELECT
A.DateTime,A.ID,A.StatusA_New
FROM A
)
SELECT
A.DateTime,A.StatusA_Old,A.StatusB_New,T.StatusA_New AS StatusA_Current
FROM
A
LEFT JOIN
T ON (A.DateTime <= T.DateTime) AND (A.ID = T.ID)
请记住,我当前的查询甚至不查看 B 中的状态更改,也不处理示例表中显示的连接日期时间表。
连接的表 AB 使用以下查询:
/*example tables*/
create table A
(
A_DateTime datetime,ID varchar(10),StatusA_Old varchar(10),StatusA_New varchar(10)
)
create table B
(
B_DateTime datetime,StatusB_Old varchar(10),StatusB_New varchar(10)
)
insert into A values
('2021-02-01 23:57:20.000',1001,NULL,'Hungry'),('2021-02-02 23:57:20.000',1002,'Sad'),('2021-02-03 23:57:20.000','Hungry','Happy')
insert into B values
('2021-02-01 23:57:20.000','Active'),('2021-02-04 23:57:20.000','Active','Inactive')
SELECT
CASE
WHEN A.A_DateTime IS NULL THEN B.B_DateTime
ELSE A.A_DateTime
END AS DateTime,CASE
WHEN A.ID IS NULL THEN B.ID
ELSE A.ID
END AS ID,StatusA_Old,StatusA_New,StatusB_Old,StatusB_New
FROM
A
FULL OUTER JOIN
B ON A.A_DateTime = B.B_DateTime
类似问题:
- Retrieve last known value for each column of a row
- SQL: Select the last record for each day given datetime
- Retrieving the last record in each group - MySQL
- SQL: How to fill empty cells with previous row value?
- 也可能与这个问题有关(正如另一个用户提到的)https://www.itprotoday.com/sql-server/last-non-null-puzzle
解决方法
对现有查询使用 CTE,然后使用子查询从 NOT NULL
中获取最新的 cte
值
WITH CTE
AS
(
SELECT COALESCE(A.A_DateTime,B.B_DateTime) AS DateTime,COALESCE(A.ID,B.ID) AS ID,StatusA_Old,StatusA_New,StatusB_Old,StatusB_New
FROM A
FULL OUTER JOIN B
ON A.ID = B.ID
AND A.A_DateTime = B.B_DateTime
)
SELECT *,(SELECT TOP 1 x.StatusA_New
FROM CTE x
WHERE x.ID = c.ID
AND x.DateTime <= c.DateTime
AND x.StatusA_New IS NOT NULL
ORDER BY x.DateTime DESC) AS StatusA_Current,(SELECT TOP 1 x.StatusB_New
FROM CTE x
WHERE x.ID = c.ID
AND x.DateTime <= c.DateTime
AND x.StatusB_New IS NOT NULL
ORDER BY x.DateTime DESC) AS StatusB_Current
FROM CTE c
ORDER BY [DateTime]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。