请教:如何写这样一条SQL语句?

xxwood 2024-07-01 16:40:37

表A结构:ID,RQ,CL     编号、日期、产量

表B结构:ID,CSRQ,CSCL   编号、测试日期、测试产量

大约有100个ID。其中表A每天一条数据,表B每月一条数据(但不固定是哪一天)。

要求如下结果集:ID,RQ,CL,CSRQ,CSCL

其中CSRQ,CSCL为表B中CSRQ不大于表A中RQ的第一条记录的数据。

请教大神们这条SQL语句怎么写啊??

...全文
589 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaozhang张@ 2小时前
  • 打赏
  • 举报
回复

SELECT A.ID, A.RQ, A.CL, B.CSRQ, B.CSCL
FROM (
SELECT ID, RQ, CL,
(SELECT CSRQ FROM 表B WHERE ID = A.ID AND CSRQ <= A.RQ ORDER BY CSRQ DESC LIMIT 1) AS CSRQ,
(SELECT CSCL FROM 表B WHERE ID = A.ID AND CSRQ <= A.RQ ORDER BY CSRQ DESC LIMIT 1) AS CSCL
FROM 表A A
) A
LEFT JOIN 表B B ON A.ID = B.ID AND A.CSRQ = B.CSRQ;

czmws1 9天前
  • 打赏
  • 举报
回复

SELECT
A.ID, A.RQ, A.CL, B.CSRQ, B.CSCL
FROM
(SELECT
ID, RQ, CL,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY RQ) AS rn
FROM
TableA) A
LEFT JOIN
(SELECT
ID, CSRQ, CSCL,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CSRQ) AS rn
FROM
TableB) B
ON
A.ID = B.ID AND B.CSRQ <= A.RQ AND B.rn = 1
WHERE
A.rn = 1

河狸吗 07-01
  • 打赏
  • 举报
回复 1

SELECT *
FROM A AS a CROSS APPLY
( SELECT TOP 1 b.CSRQ,b.CSCL FROM B AS b WHERE a.BH = b.BH
AND a.RQ >= b.CSRQ ORDER BY b.CSRQ DESC ) AS c
ORDER BY a.BH,a.RQ

xxwood 07-02
  • 举报
回复
@河狸吗 膜拜大神!
  • 打赏
  • 举报
回复

SELECT
A.ID,
A.RQ,
A.CL,
B.CSRQ,
B.CSCL
FROM
表A A
LEFT JOIN (
SELECT
ID,
CSRQ,
CSCL,
ROW_NUMBER() OVER(PARTITION BY ID ORDER BY CSRQ DESC) AS rn
FROM
表B
) B ON A.ID = B.ID AND B.CSRQ <= A.RQ AND B.rn = 1
WHERE
A.ID IN (SELECT DISTINCT ID FROM 表B)
ORDER BY
A.ID,
A.RQ;
这个查询的工作原理如下:
1.子查询: 首先,对表B进行子查询,使用窗口函数ROW_NUMBER()对每个ID的记录按CSRQ降序排列,并为每组ID的记录分配一个行号(rn)。这样,每个ID的最新(或最大的CSRQ)记录将得到rn=1。
2.LEFT JOIN: 然后,将表A与子查询的结果进行左连接。连接条件确保了B表中的CSRQ不大于A表中的RQ,并且只选取rn=1的记录,即每个ID在CSRQ不大于对应A表RQ的记录中最晚的一条。
3.WHERE子句: 这里通过WHERE子句限制了只有在表B中存在的ID才会被选中,确保了结果集中ID的范围是表B中出现过的ID。
4.ORDER BY: 最后,按照ID和RQ对结果进行排序,以便查看结果时更加清晰

xxwood 07-01
  • 举报
回复
@只吹45°风 大神我试了一下这样不行啊。比如我查询日期为2024-4-1的数据,如果某个ID在2024-4-1之后在表B中有记录,都查不出来啊,CSRQ和CSCL都是空值。因为按照排序规则,该ID在表B中2024-4-1之前的的那条数据的RN不是1啊。
xxwood 07-01
  • 举报
回复
@xxwood 还有我需要以表A的ID为主,表B中如果没有该ID,则CSRQ和CSCL填空值即可。
xxwood 07-01
  • 举报
回复
@只吹45°风 我写出来了:SELECT * FROM (SELECT T.*,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CSRQ DESC) RN FROM (SELECT * FROM (SELECT A.ID,A.RQ,A.CL,B.CSRQ,B.CSCL FROM A,B WHERE A.ID=B.ID(+)) WHERE B.CSRQ&lt;=A.RQ OR B.CSRQ IS NULL) T) WHERE RN=1 还是非常感谢大神提供的思路!

17,113

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧