连接两个表时如何仅返回最近的日期
Posted
技术标签:
【中文标题】连接两个表时如何仅返回最近的日期【英文标题】:How to return only the most recent date when joining two tables 【发布时间】:2021-03-29 07:57:31 【问题描述】:我有一个医生 NPI # 列表,我需要将其转换为内部客户 ID #,然后使用这些客户 ID 检查呼叫中心代表上次联系他们的时间。为此,我正在使用两个表,NPI_Conversion
(cid
,npi
)和Call_Center
(call_center_cid
,customer_name
,call_date
)。我只想返回从呼叫中心联系客户的最近日期。此查询为我获取所需的数据,但它返回对 NPI 的每次调用:
SELECT call_center_cid, cid, customer_name, caller_name, npi, call_date
FROM CALL_CENTER
LEFT JOIN NPI_CONVERSION
ON call_center_cid = cid
WHERE NPI IN ( # LIST OF RELEVANT NPI #'s)
我看到其他一些帖子使用max(date)
,所以我尝试这样使用它:
SELECT call_center_cid, cid, customer_name, caller_name, npi, max(call_date) AS recent_call
FROM CALL_CENTER
LEFT JOIN NPI_CONVERSION
ON call_center_cid = cid
WHERE NPI IN ( # LIST OF RELEVANT NPI #'s)
GROUP BY 1, 2, 3, 4, 5
但这只会返回每个 caller_name
的最大日期
【问题讨论】:
请用您正在运行的数据库标记您的问题:mysql、Oracle、SQL Server...? 【参考方案1】:可移植选项使用子查询进行过滤:
select cc.*, nc.npi
from call_center cc
inner join npi_conversion nc on cc.call_center_cid = np.cid
where
nc.npi in (...)
and cc.call_date = (
select max(cc1.call_date)
from call_center cc1
where cc1.customer_name = cc.customer_name
)
这将利用call_center (customer_name, call_date)
上的索引。
请注意,我将left join
更改为inner join
(where
子句中的过滤清楚地表明这就是你想要的),并在所有列之前加上它们所属的表(这使得查询更清楚地了解底层数据结构)。
如果你的数据库支持窗口函数,你也可以这样做:
select cc.*, np.npi
from (
select cc.*,
rank() over(partition by customer_name order by call_center_cid desc) as rn
from call_center cc
) cc
inner join npi_conversion nc on cc.call_center_cid = np.cid
where nc.npi in (...)
【讨论】:
非常有帮助,而且是一种与我想的完全不同的方法!一般来说,在单独的查询中提前获取 NPI 到 CID 转换的列表并将它们粘贴到此查询中以避免使用 JOIN 会更有效吗?【参考方案2】:类似于 GMB 的回答:
您可以在加入后应用 ROW_NUMBER 以获取最新行:
SELECT call_center_cid, cid, customer_name, caller_name, npi, call_date
FROM CALL_CENTER
LEFT JOIN NPI_CONVERSION -- RIGHT JOIN?
ON call_center_cid = cid
WHERE NPI IN ( # LIST OF RELEVANT NPI #'s)
QUALIFY -- filter latest date per cid
ROW_NUMBER()
OVER (PARTITION BY cid
ORDER BY call_date DESC) = 1
您当前的 WHERE 将 LEFT 连接变成了 INNER 连接,也许您想要一个 RIGHT 连接。
【讨论】:
以上是关于连接两个表时如何仅返回最近的日期的主要内容,如果未能解决你的问题,请参考以下文章