当前位置: 首页 > 面试题库 >

SQL查询基于最近的时间戳联接两个表

相云
2023-03-14
问题内容

我在SQL中有两个表,并且我需要能够基于早于或等于表A中的时间戳的表B中的时间戳进行联接。

因此,这是两个表和所需输出的一些虚假数据:

结案案例(表A)

| id | resolution |         timestamp          |
------------------------------------------------
|  1 |     solved | 2006-10-05 11:55:44.888153 |
|  2 |     closed | 2007-10-07 12:34:17.033498 |
|  3 |    trashed | 2008-10-09 08:19:36.983747 |
|  4 |     solved | 2010-10-13 04:28:14.348753 |

分类(表B)


| id |    value    |         timestamp          |
-------------------------------------------------
|  1 |    freshman | 2006-01-01 12:02:44.888153 |
|  2 |   sophomore | 2007-01-01 12:01:19.984333 |
|  3 |      junior | 2008-01-01 12:02:28.746149 |

所需结果

| id | resolution |         timestamp          |    value    |
--------------------------------------------------------------
|  1 |     solved | 2006-10-05 11:55:44.888153 |    freshman |
|  2 |     closed | 2007-10-07 12:34:17.033498 |   sophomore |
|  3 |    trashed | 2008-10-09 08:19:36.983747 |      junior |
|  4 |     solved | 2010-10-13 04:28:14.348753 |      junior |

因此,我知道代码需要如下所示,我只是想不出该如何处理ON部分JOIN($ 1和$ 2是将要传入的变量):

SELECT case.id, case.resolution, case.timestamp, class.value
  FROM closed_cases AS case
  LEFT JOIN classifications AS class ON ???
  WHERE case.timestamp BETWEEN $1 AND $2;

我知道我可以使用子选择,但这将在至少几千行,甚至可能更多的行上进行,我需要它真的要快。所以我希望有一个简单的子句可以做到。


问题答案:

如果可以更改表的结构,建议更改分类表以包括结束日期和开始日期-这样将更容易加入表。

如果没有,我建议如下:

SELECT case.id, case.resolution, case.timestamp, class.value
  FROM closed_cases AS case
  LEFT JOIN (select c.*, 
                    (select min(timestamp)
                     from classifications c1
                      where c1.timestamp > c.timestamp) timeend
             from classifications c) AS class 
  ON case.timestamp >= class.timestamp and 
     (case.timestamp < class.timeend or class.timeend IS NULL)
  WHERE case.timestamp BETWEEN $1 AND $2;

编辑-结束日期为分类:

SELECT case.id, case.resolution, case.timestamp, class.value
  FROM closed_cases AS case
  LEFT JOIN classifications AS class 
  ON case.timestamp >= class.timestamp and case.timestamp < class.timeend
  WHERE case.timestamp BETWEEN $1 AND $2;


 类似资料:
  • 我需要将两个数据集与CLOSE时间戳连接起来。第一个数据集是来自移动应用程序的日记数据集: 在这里: 第二个数据集是来自加速度计日志的数据集,显示移动(=INVH)或空闲(=NIVH): 在这里: 我需要根据时间戳字段之间的时间差连接两个数据帧。例如,在df1上留下join,以查看应用程序日志数据如何与实际加速度计日志一致。简单的左连接在这里不起作用,因为在大多数情况下有一个滞后时间。所以我的问题

  • 在DynamoDB中,我有一个表,其中每条记录都有两个日期属性,

  • 问题内容: 我有两个要结合并插入到基于三列组合的另一个表中的表。我会解释。 表M 表N 现在,这两个表必须匹配,并根据以下内容插入到 表MN 中: 所以从理论上讲,我的输出 表MN 应该是 表M 大约有140万条记录, 表N 大约有90万条记录。 我已尝试根据以下两个查询将两个表连接起来。但是执行需要花费数小时,如果我必须每天运行一次,这是不可行的。 当我只运行上述2个查询的SELECT语句时,在

  • 问题内容: 我目前正在编写更新语句,以使可查询表保持最新状态。这两个表之间的架构相同,内容也不重要: 我的更新语句如下所示: 需要注意的两件事是:1)更新结束时没有where子句(这可能是问题所在); 2)更新后的所有记录都具有相同的值。我的意思是: 我的问题是如何解决此问题,以使表正确地将登台的“新”数据反映为正确的SQL更新? 更新 因此,我的登台数据可以恰好反映了其中的内容,为了便于讨论,它

  • 我的架构如下所示: 这是你的小提琴 图式的快速解释:我有广告: 每个广告都有洞察力,这些洞察力告诉我们某个广告何时处于活动状态(=>ad_clicks必须>0)。 每个ad都有产品(MANY2MONE-表)。每个产品都有,它告诉我们该产品在某一天产生了多少销售额。 现在,我想获取时间范围-的所有广告,这些广告的>0(我已经做了),并计算每个广告在活动时产生了多少销售额。因此,只有当广告的ad_in

  • 我需要连接来自两个不同表的数据,如下所示。仅使用一个sql查询就可以做到这一点吗?如果“key”和“name”在两个表上,那么它们是相同的。表1中的“状态”始终为“-”,表2中的“T”。此外,两个表上的“名称”和“comp”都匹配(例如:Name3-C和Name4-B)<我尝试过“联合”和“加入”,但还没有解决办法! 表1 表2 结果应该是。。。 提前谢谢!