SQL JOIN 两个表和第二个表仅获取最新条目并具有 2 个 ID



我有两个表。

市场表

ID       main_key     sub_key     name      created_at
------------------------------------------------------
1        1            1           bottle    1606636000
2        2            1           flask     1606642546
3        2            2           flask     1606650045
4        3            1           can       1606650445
5        3            2           can       1606651546
6        4            1           glass     1606652545

市场更新表

ID       main_key     sub_key     price     update
------------------------------------------------------
1        1            1           100       1606665555
2        2            1           120       1606665555
3        2            2           150       1606665555
4        3            1           500       1606665555
5        3            2           550       1606665555
6        4            1           25        1606665555
7        1            1           110       1606665666
8        2            1           135       1606665666
9        2            2           145       1606665666
10       3            1           490       1606665666
11       3            2           440       1606665666
12       4            1           29        1606665666

我试过了。

SELECT *
FROM market m
JOIN (
SELECT MAX(id) max_id, fk_main_key
FROM market_update
GROUP BY fk_main_key, sub_key
) m_max ON (m_max.fk_main_key = m.main_key)
JOIN market_update mu ON (mu.id = m_max.max_id)

但它把它放大了很多倍,最后我得到了很多相同的线条。我认为它是main_key数量和sub_key数量的倍数。

我正试图将JOINMARKET_UPDATES加入MARKET,这样我就可以从MARKET_UPDATE获得最新价格,但我的问题是我有两个id,main_key&sub_key

因此,我必须在MARKET_UPDATES中将MARKET表与id(7-12(合并。

这里有一种基于查询的方法:

SELECT *
FROM market m
JOIN (
SELECT MAX(id) max_id , fk_main_key, sub_key
FROM market_update
GROUP BY fk_main_key, sub_key
) m_max 
ON (m_max.fk_main_key = m.main_key 
and m_max.sub_key = m.sub_key)
JOIN market_update mu ON (mu.id = m_max.max_id)

这里是使用窗口函数RANK()的另一种方法:

SELECT *
FROM market m
JOIN (
SELECT id
, fk_main_key
, sub_key 
, rank() over (partition by fk_main_key, sub_key order by id desc ) rnk
FROM market_updat  
) mu 
ON mu.fk_main_key = m.main_key 
and mu.sub_key = m.sub_key
and  rnk = 1

最新更新