使用 SQL JOIN,如何将一张表的结果限制为最近的记录

Posted

技术标签:

【中文标题】使用 SQL JOIN,如何将一张表的结果限制为最近的记录【英文标题】:With SQL JOIN, how to limit the results of one table to most recent record 【发布时间】:2021-08-28 12:31:29 【问题描述】:

我正在尝试使用 join 的 select sql 语句,但无法将结果集限制为我想要的。

这是两张表

资产

ACCOUNT_ID NAME ACTIVE
99492 12204 TRUE
99492 12205 TRUE
99492 12206 FALSE
99492 12207 TRUE

设备状态

ACCOUNT_ID ASSET_NAME LANDMARK_NAME EVENT_DATE
99492 12204 WAREHOUSE 1 2021-06-11 11:04:23 AM
99492 12204 WAREHOUSE 1 2021-06-11 10:54:38 AM
99492 12204 WAREHOUSE 1 2021-06-11 11:07:13 AM
99492 12205 WAREHOUSE 3 2021-06-11 09:08:27 AM
99492 12205 WAREHOUSE 3 2021-06-11 12:05:29 PM
99492 12206 WAREHOUSE 5 2021-06-11 08:23:56 PM
99492 12207 WAREHOUSE 9 2021-06-11 04:47:12 PM

我想要实现的是对于资产中 ACTIVE=TRUE 的每个结果,我想要来自 DEVICE_STATE 的最新 EVENT_DATE。在此示例数据中,结果将是

ACCOUNT_ID ASSET_NAME LANDMARK_NAME EVENT_DATE
99492 12204 WAREHOUSE 1 2021-06-11 11:07:13 AM
99492 12205 WAREHOUSE 3 2021-06-11 12:05:29 PM
99492 12207 WAREHOUSE 9 2021-06-11 04:47:12 PM

我在这里搜索了很多答案并尝试了几个不同的查询 - 最近一次是这个

select
    A.NAME, d.LANDMARK_NAME, d.LANDMARK_ON_START
from ASSET a 
    JOIN  ( select d.*, ROW_NUMBER() 
            OVER (PARTITION BY ASSET_NAME ORDER BY EVENT_DATE DESC) AS seqnum
            FROM DEVICE_STATE d 
        ) d ON a.ACCOUNT_ID = 99492 
            AND a.ACTIVE = 'TRUE' 
            AND d.ASSET_NAME = a.NAME 
            AND seqnum = 1

虽然此代码不会引发任何错误,但它会永远执行,这让我相信它不仅仅是选择最近的 EVENT_DATE(每个 ASSET_NAME 可能有成千上万个),而是试图处理所有这些.

是否对此代码进行了调整以解决该问题,或者是否有完全不同的方法来解决此问题?感谢您的帮助。

【问题讨论】:

【参考方案1】:
SELECT r1.ACCOUNT_ID,r1.ASSET_NAME,r1.LANDMARK_NAME,MAX(r1.EVENT_DATE) AS  EVENT_DATE 
      FROM DEVICE_STATE r1 
      JOIN ASSET r2 ON t1.ASSET_NAME=r2.name 
      WHERE r2.active 
      GROUP BY ACCOUNT_ID,ASSET_NAME,LANDMARK_NAME

假设 ASSET.NAME 字段在 ASSET 表中是唯一的,否则您必须在 JOIN 中添加 ACCOUNT_ID。

【讨论】:

谢谢。 ASSET.NAME 可以在不同的 ACCOUNT_ID 上多次存在,所以我同意应该添加。当我运行它时,我会为每个 ASSET_NAME 的每个现有 LANDMARK_NAME 获取最新的 EVENT_DATE。我只想要最近的 EVENT_DATE,而不管它与哪个 LANDMARK_NAME 相关,那么我们如何调整它以使每个 ASSET_NAME 只显示一行? > 我只想要最近的 EVENT_DATE,无论它与哪个 LANDMARK_NAME 相关...您只能按 ASSET_NAME 进行分组,但这意味着您不能将您写的内容作为最终结果,它是一个 pb逻辑上,你必须如何定义如何选择 LANDMARK_NAME ......我无法弄清楚......

以上是关于使用 SQL JOIN,如何将一张表的结果限制为最近的记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL问题,怎么将一张表的某个字段更新为另一张表的字段

sql怎么将一张表的字段赋值给另一张表

sql查询:使用内连接查询两张表的时候,如果左边表的一条记录对应了右边表的两条记录,结果显示排列问题

INNER JOIN:第二张表的限制为 0,1

sql怎么把两张表合并成一张

SQL SERVER,一张表中,有多个字段关联另一张表,怎么写SQL语句?