sql - 使用 max(date) 连接表,其中 date 小于另一个表 end_date 值
问题描述
我在 ansi-89 中有 Oracle sql 查询。我试图用 JOINS 将其重写为代码。
SELECT * FROM (SELECT *
FROM A
JOIN B ON A.b_id = B.id
JOIN (SELECT class_id, group_id, name, eff_date,
max(eff_date) OVER(PARTITION BY class_id, group_id) max_date FROM C) T
on T.class_id= A.class_id AND T.group_id= A.group_id)
WHERE eff_date = max_date;
max(eff_date)
在这种情况下,我在表中获取记录C
,但我需要使用表中的值来限制C.eff_date
值。B.end_date
B
我想加入来自 C 的所有记录,C.eff_date < B.end_date
这些记录将在子查询中,然后以相同的方式使用 group by 或 OVER(...) 语句选择 max(date)。不会有效吗?我还有 3 个表,例如 C 表,以在日期值不大于B.end_date
. 我怎样才能以正确的方式做到这一点?
SELECT * FROM (SELECT A.*, B.end_date, C.name, C.eff_Date,
max(C.eff_date) OVER (PARTITION BY C.class_id, C.group_id) max_date
FROM A
JOIN B ON A.b_id = B.id
JOIN C on C.class_id = A.class_id AND C.group_id= A.group_id AND C.eff_date <= B.end_date) T
WHERE T.eff_date= T.max_date
编辑: 链接到 sqlfiddle
Table A
ID B_ID CLASS_ID GROUP_ID
1 1 AA BB
2 2 AA CC
Table B
ID SOME_VAL END_DATE
1 value1 03-MAY-19
2 value2 05-MAY-19
Table C
CLASS_ID GROUP_ID NAME EFF_DATE
AA BB name1 01-MAY-19
AA BB name2 02-MAY-19
AA BB name3 03-MAY-19
AA BB name4 04-MAY-19
AA CC name1 01-MAY-19
AA CC name2 02-MAY-19
AA CC name3 03-MAY-19
AA CC name4 04-MAY-19
加入后我想得到:
A.ID A.CLASS_ID A.GROUP_ID B.END_DATE NAME EFF_DATE
1 AA BB 03-MAY-19 name3 03-MAY-19
2 AA CC 05-MAY-19 name4 04-MAY-19
解决方案
推荐阅读
- npm - npm - 404 未找到 - 获取 http://registry.npmjs.org/https-proxy-agent-snyk-fork
- java - 如何在不使用任何循环的情况下交换二维数组的第一个和最后一个字符串?
- r - 确定 url 是 R 中的 pdf 还是 html 文件
- java - 如何根据用户输入声明变量?
- python - 如何获得一个函数来读取输入并定义它
- windows - 无法在 Windows Server 2012 上重新启动 Jenkins(正在使用的端口)
- redis - Redis Cluster - 无法建立连接Redis主从
- r - 左连接不重复相同的列
- php - 使用 find_files php 函数查找儿童文件夹
- linux - 相同版本的 jq 在 Ubuntu 16 和 Ubuntu 18 上的行为不同