使用 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,如何将一张表的结果限制为最近的记录的主要内容,如果未能解决你的问题,请参考以下文章