具有不同主键值的 SQLite 连接表
Posted
技术标签:
【中文标题】具有不同主键值的 SQLite 连接表【英文标题】:SQLite Join Tables With Different Primary Key Values 【发布时间】:2022-01-13 18:30:25 【问题描述】:我在 SQLITE 中有两个表,一个表 FastData
以高速率记录数据,而另一表 SlowData
以较低速率记录数据。 FastData
和 SlowData
共享一个表示数据捕获时间的主键 (PK
)。因此,这两个表可能如下所示:
Fast Data Slow Data
Pk Value1 Pk Value2
2 1 1 1
3 2 4 2
5 3 7 3
6 4
7 5
9 6
我想创建一个 Select 语句,将这两个填写 SlowData
的表与之前捕获的数据连接起来。
Join Data
Pk Value1 Value2
2 1 1
3 2 1
5 3 2
6 4 2
7 5 3
9 6 3
【问题讨论】:
我目前最好的就是使用左连接Select FastData.PK, FastData.Value1, Slowdata.Value2
From FastData
Left Join SlowData ON FastData.PK = SlowData.PK
Order By FastData.PK
【参考方案1】:
您可以尝试以下方法,该方法使用row_number
确定与Pk
相关的最新条目,作为执行左连接后Value2
的理想条目。
SELECT
Pk,
Value1,
Value2
FROM (
SELECT
f.Pk,
f.Value1,
s.Value2,
ROW_NUMBER() OVER (
PARTITION BY f.Pk, f.Value1
ORDER BY s.Pk DESC
) rn
FROM
fast_data f
LEFT JOIN
slow_data s ON f.Pk >= s.Pk
) t
WHERE rn=1;
Pk | Value1 | Value2 |
---|---|---|
2 | 1 | 1 |
3 | 2 | 1 |
5 | 3 | 2 |
6 | 4 | 2 |
7 | 5 | 3 |
9 | 6 | 3 |
View working demo on DB Fiddle
【讨论】:
【参考方案2】:您需要一个LEFT
表连接和FIRST_VALUE()
窗口函数来选择Value2
:
SELECT DISTINCT f.Pk, f.Value1,
FIRST_VALUE(s.Value2) OVER (PARTITION BY f.Pk ORDER BY s.Pk DESC) Value2
FROM FastData f LEFT JOIN SlowData s
ON s.Pk <= f.Pk;
请参阅demo。
【讨论】:
以上是关于具有不同主键值的 SQLite 连接表的主要内容,如果未能解决你的问题,请参考以下文章