【发布时间】:2020-02-20 06:00:18
【问题描述】:
我有 2 张桌子。第一个是个人 (ID) 列表和交易日期。第二个是客户历史记录表,其中包含客户数据随时间变化的快照。我有兴趣为最接近但在交易日期之前的运行日期提取会员标志。
* 编辑:我尝试使用 TOP 1,并排名超过/分区...但它们运行时间太长。我无权在表上创建索引。这是我需要的查询:
SELECT t1.*, t2.RunDate, t2.CST_ISMEMBER
FROM table1 t1
INNER JOIN table2 t2
ON t1.ID=t2.ID
AND t2.RunDate =
(SELECT MAX(t2b.RunDate)
FROM table2 t2b
WHERE t2b.ID=t2.ID AND t1.TransDate >= t2b.RunDate)
更多编辑 * 我发现对于表 1 中的大约 9K 个人,表 2 中的运行日期发生在交易日期之后。所以现在我需要找到最接近(之前或之后)交易的日期。努力寻找不涉及排名超过/分区或前 1 的 datediff 解决方案,因为我缺乏索引问题。我不得不在 5 分钟后终止查询,这样我才不会被 IT 大喊大叫;-) 这些是表 2 中最大的可用索引。
TABLE 1
ID TransDate
1 8/20/13
2 9/5/14
TABLE 2
ID RunDate IsMember
1 6/30/2010 Y
1 7/11/2012 N
1 7/30/2013 N
1 8/15/2013 Y
2 9/1/2014 Y
2 9/10/2014 N
想要的结果:
ID TransDate IsMember
1 8/20/13 N
2 9/5/14 Y
解决这个问题的最佳方法是什么?
提前致谢。
【问题讨论】:
-
您使用的是哪种 DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tag。 Why should I tag my DBMS
-
@kiki1113 。 . .您应该使用表格上可用的索引来编辑您的问题。
-
@GordonLinoff - 更新为包含索引。谢谢!
标签: sql sql-server