微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

返回一个列,该列显示记录表中每行 ID 的最后一个已知值 (MAX DateTime) - SQL

如何解决返回一个列,该列显示记录表中每行 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

类似问题:

解决方法

对现有查询使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?