如何将一个表与另一个表中的一系列值连接起来?

Posted

技术标签:

【中文标题】如何将一个表与另一个表中的一系列值连接起来?【英文标题】:How to join a table with a range of values from another table? 【发布时间】:2020-02-23 03:46:39 【问题描述】:

我目前非常希望将两张桌子连接在一起。但通常,当您想要连接两个表时,它们只有在两边的值本身相等时才会连接。如果一个值在一个区间内,我正在寻找一个连接。让我解释一下:

我有这些表:

inscription(studentNumber, note)
thresVal(threshold, value)

表格题字看起来有点像这样:

studentNumber | note 
--------------+------
123           | 78   
456           | 65   
789           | 52   
012           | 90   
345           | 37   

tresVal 看起来像这样:

 treshold | value
----------+--------
       90 |    4.3
       85 |      4
       80 |    3.7
       77 |    3.3
       73 |      3
       70 |    2.7
       65 |    2.3
       60 |      2
       57 |    1.7
       54 |    1.3
       50 |      1 
       35 |    0.5
        0 |      0

现在,我想要的是一个连接,它检查学生笔记的范围并相应地添加行“值”,如下所示:

studentNumber | note | value
--------------+-------
123           | 78   | 3.3
456           | 65   | 2.3
789           | 52   | 1
012           | 90   | 4.3
345           | 37   | 0.5

如您所见,范围介于行的值与其前一个值之间。 65 的音符大于或等于阈值 65,因此它的值必须是 2.3。从 65 到 69 的所有音符都必须赋予 2.3 的值,依此类推。

我似乎无法为这个问题想出一些好的东西,我所能想到的就是一个接一个地对每种可能性进行硬编码,但必须有一个更简单的答案。

【问题讨论】:

这能回答你的问题吗? Best way to join on a range? 【参考方案1】:

“通常......只有当双方的值本身相等时才加入” - 那又怎样!这是早期努力导致这种情况的结果,而不是因为自然是那样的。 没有什么需要通常的方式。它不适合您的情况,然后根据需要设置加入。在这种情况下,您需要加入一系列值 - 这样做。 以下将为您提供。 CTE 使用窗口 LEAD 函数从当前行的下一行组合值并创建一个开放、封闭的范围。然后将此范围加入到结果范围上的铭文中。

with tresVal_range as 
     (select int4range(treshold, coalesce(lead(tresHold) over(order by treshold), 10000),'[)') treshold, value
        from tresVal
     )
select i.studentnumber,i.note, t.value
  from inscription   i
  join tresval_range t
    on i.note <@ t.treshold
 order by i.studentnumber;    

【讨论】:

以上是关于如何将一个表与另一个表中的一系列值连接起来?的主要内容,如果未能解决你的问题,请参考以下文章

hibernate jpa将两个表与另一个表连接起来

如何将同一表中的一条记录与另一条记录关联?

连接与关联

将三行与另一表中的一行连接起来

如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来

如何将一个表与另一个表连接,然后计算非空列并将它们按另外两个字段分组?