sql - 如果第一个返回 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 有点生疏。
如果有人知道更好的方法,我将不胜感激!
解决方案
请试试这个:
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
推荐阅读
- swift - 快速缩放两个重叠的图像
- c# - 删除 innerXML 后,如何删除 C# 中的空标签?
- javascript - 将文本添加到标签末尾并包含
无法正常工作的标签 - python - 即使我输入数字,猜谜游戏按钮是否应该什么也不做?
- c++ - std::thread 从内部线程函数中释放
- netlogo - 在 Netlogo 中用一只乌龟停止整个按钮
- netflix-conductor - Netflix 指挥健康检查
- c# - 如何读取 SQL 位数据类型并将其写入 C# 中的文件
- .net-core - 使用 Scaffold-DbContext、EntityFrameworkCore.Jet、.NetCore 时,错误无法从程序集 System.Data 加载类型 System.Data.OleDb.OleDbConnection
- azure - 如何修复“目标位置不存在用于分片映射管理器持久性的数据结构。” 在天蓝色的弹性工作中