postgresql SQL对于给定的名称,如果某个表中的最新行比另一个表中该名称的最新日期新,则获取该表中的最新行

eqoofvh9  于 2023-01-05  发布在  PostgreSQL
关注(0)|答案(3)|浏览(124)

如果我有两个表,表A和表B,对于一个给定的名字,我怎样才能只在表A的最新日期比表B中的最新日期新,或者表B中不存在这个名字的情况下,才能得到表A的最新日期。
尝试但未获得任何结果,至少需要table_a中的行

SELECT t1.* FROM table_a t1 
WHERE t1.date > (SELECT MAX(t2.date) 
FROM table_b t2 
WHERE t1.name = t2.name) 
ORDER BY t1.date DESC LIMIT 1

表A
| 身份证|姓名|日期|状态|年龄|
| - ------|- ------|- ------|- ------|- ------|
| 1个|约翰|2022年11月25日05时02分55秒|纽约州|三十二|
| 第二章|玛丽|2022年11月28日08时05分55秒|高|二十六|
| 三个|玛丽|2022年11月25日01时02分54秒|佛罗里达州|二十五|
| 四个|比尔|2022年11月28日05时02分35秒|纽约州|三十二|
| 五个|比尔|2022年11月15日05时02分55秒|高|二十六|
| 六个|比尔|2022年11月11日07时33分21秒|佛罗里达州|二十五|
表B
| 身份证|姓名|日期|学院|重量|
| - ------|- ------|- ------|- ------|- ------|
| 1个|约翰|2022年11月26日05时02分55秒|纽约大学|一百八十|
| 第二章|玛丽|2022年11月27日05时02分55秒|高强度单位|一百四十|
| 三个|玛丽|2022年11月25日05时02分55秒|流感|一百五十五|
预期结果
| 身份证|姓名|日期|状态|年龄|
| - ------|- ------|- ------|- ------|- ------|
| 第二章|玛丽|2022年11月28日08时05分55秒|高|二十六|
| 四个|比尔|2022年11月28日05时02分35秒|纽约州|三十二|

63lcw9qa

63lcw9qa1#

SELECT distinct on (name) * FROM table_a AS a
WHERE NOT EXISTS (
    SELECT true FROM table_b AS b 
    WHERE a.name=b.name AND a.date<b.date )
ORDER BY name, date desc;

1.latest for table A -distinct on允许您选择给定组的最新记录,按日期排序。
1.* 仅当它比表B中的最新日期新或者名称在表B中不存在 * -这将直接转换为not exists子查询表达式。我假设您指的是相同名称的最新日期。
Online demo

n7taea2i

n7taea2i2#

试试这个

SELECT DISTINCT ON a.name
     , a.*
  FROM table_A AS a
  LEFT JOIN LATERAL 
     ( SELECT max(b.date) AS date_max
         FROM table_B AS b
        WHERE b.name = a.name
     ) AS m
    ON True
 WHERE m.date_max IS NULL
    OR a.date >= m.date_max
 ORDER BY a.name, a.date DESC
vfh0ocws

vfh0ocws3#

如果我没理解错的话,这应该能达到你的目的:

SELECT 
a.id, a.name, a.date, a.state, a.age
FROM table_a a
WHERE 
(a.name, a.date) IN 
(SELECT a.name, MAX(a.date) FROM table_a a
GROUP BY a.name)
AND ((NOT EXISTS (SELECT 1 FROM table_b b WHERE a.name = b.name))
OR a.date > (SELECT MAX(date) FROM table_b b WHERE a.name = b.name));

查询的主要部分,在AND之前将获取每个具有最新日期的名称。您可以删除查询的其余部分来证明这一点。
然后应用另外两个条件。NOT EXISTS选项将查找那些没有出现在另一个表中的名称。
第二个选项是名称出现在那里,但最新日期仍然早于第一个表中的日期。
使用示例数据在此处进行尝试:db<>fiddle

相关问题