sql - 根据当前行获取第一个
问题描述
在 Oracle DB 中有三个表,例如equip_type
、output_history
和。time_history
如下图三张表如何连接?(数据库管理系统:甲骨文)
EQUIP MODEL DATE1 QUANTITY DATE2 TIME EQUIP_TYPE
---- ---- ---------- ------ -------- ---- ----------
e1 m1 20180103 10 20180101 6 A
e1 m1 20180106 20 20180105 5 A
请注意,在 in 点DATE1
'20180103'
,output_history
inDATE2
'20180101'
是time_history
最新的。
在 in 点DATE1
'20180106'
,output_history
in'DATE2 20180105'
是time_history
最新的。
--equip_type table and the date
CREATE TABLE equip_type (
EQUIP_TYPE VARCHAR(60),
EQUIP VARCHAR(60)
);
INSERT INTO equip_type VALUES ('A','e1');
-- output_history and data
CREATE TABLE output_history (
EQUIP VARCHAR(60),
MODEL VARCHAR(60),
Data1 VARCHAR(60),
QUANTITY NUMBER(10)
);
INSERT INTO output_history VALUES ('e1','m1','20180103',10);
INSERT INTO output_history VALUES ('e1','m1','20180106',20);
--time_history table and data
CREATE TABLE time_history (
EQUIP VARCHAR(60),
MODEL VARCHAR(60),
Data2 VARCHAR(60),
time NUMBER(10)
);
INSERT INTO time_history VALUES ('e1','m1','20180101',6);
INSERT INTO time_history VALUES ('e1','m1','20180105',5);
解决方案
您可以使用带有NOT EXIST
条件的相关子查询来选择 中最接近的相关记录time_history
。
我在这个 db fiddle中测试了下面关于 MySQL 的查询。您没有标记您正在使用的 RDBMS。我在 MySQL 上进行了测试,但这是适用于大多数 RDBMS 的标准 SQL。
SELECT
o.equip,
o.model,
o.data1,
o.quantity,
t.data2,
t.time,
e.equip_type
FROM
output_history o
INNER JOIN equip_type e ON e.equip = o.equip
INNER JOIN time_history t ON t.equip = o.equip AND t.data2 <= o.data1
WHERE NOT EXISTS (
SELECT 1
FROM time_history
WHERE
equip = o.equip
AND data2 <= o.data1
AND data2 > t.data2
)
sid notes : 查询总是在当前time_history
记录之前output_history
查找最近的记录(即使以后有最近的记录也不会被选中)
免责声明:不要将日期存储为字符串,这是灾难的根源。根据您的 RDBMS 使用相关数据类型。在您的用例中,它之所以有效,只是因为日期的格式易于排序。
推荐阅读
- html - 用 css 网格突围
- python - 气流:从 PostgresOperator 中的模板化 SQL 访问 ti.xcom_pull()
- javascript - 如何从状态访问卸载状态
- ros - catkin 如何与 ROS2 一起使用?
- c# - 直接从 HttpServer 返回响应
- java - 我想将我当前的移动日期与我的 firebase 日期进行比较,然后显示用户点击日期的数据
- c# - 从 AAD 登录获取令牌
- python - 为什么我的 QVideoFilterRunnable 在 PySide2 中的“run()”方法没有被执行?
- python - 每个进程运行多个蜘蛛 - 不保存输出数据
- symfony - Symfony 命令的 Docker 执行:权限被拒绝