首页 > 解决方案 > 如果第一个返回 NULL,则从第二个子查询中选择列

问题描述

我有两个与 PHP 脚本分开运行的查询。首先是检查标识符(组)是否在表中具有时间戳。

SELECT
    group, MAX(timestamp) AS timestamp, value
FROM table_schema.sample_table
GROUP BY group, value

如果没有时间戳,则运行第二个查询,从单独的表中检索最小时间戳:

SELECT 
    group, MIN(timestamp) as timestamp, value AS value
FROM table_schema.src_table
GROUP BY group, value

并从那里继续。

为了简洁起见,我想做的是有一个运行第一个语句的查询,但如果为 NULL,则默认为第二个。我已经尝试过使用 coalesce() 和 CASE 语句,但是它们需要子查询来返回单列(我还没有遇到问题)。然后我决定我应该尝试使用聚合时间戳对表进行 JOIN 以获取整行,但很快意识到我不能改变正在连接的表(据我所知)。我选择尝试加入这两个结果并获得最大值,如下所示:

编辑:我好累,这应该是 UNION,而不是 JOIN

抱歉任何可能的混淆:(

SELECT smpl.group, smpl.value, MAX(smpl.timestamp) AS timestamp 
FROM table_schema.sample_table as smpl
INNER JOIN 
    (SELECT src.group, src.value, MIN(src.timestamp) AS timestamp 
     FROM source_table src
    GROUP BY src.group, src.value) AS history
ON
    smpl.group = history.group
        
GROUP BY smpl.group, smpl.value

我对此没有SELECT MAX()意见,因为它确实很慢,很可能是因为我的 SQL 有点生疏。

如果有人知道更好的方法,我将不胜感激!

标签: sqlpostgresqlpostgresql-11

解决方案


请试试这个:

select mx.group,(case when mx.timestamp is null then mn.timestamp  else mx.timestamp end)timestamp,
(case when mx.timestamp is null then mn.value else mx.value end)value
(
    SELECT
       group, MAX(timestamp) AS timestamp, value
    FROM table_schema.sample_table
    GROUP BY group, value
)mx
left join
(
    SELECT 
         group, MIN(timestamp) as timestamp, value AS value
    FROM table_schema.src_table
    GROUP BY group, value
)mn
on mx.group = mn.group

推荐阅读