17,140
社区成员




表A结构:ID,RQ,CL 编号、日期、产量
表B结构:ID,CSRQ,CSCL 编号、测试日期、测试产量
大约有100个ID。其中表A每天一条数据,表B每月一条数据(但不固定是哪一天)。
要求如下结果集:ID,RQ,CL,CSRQ,CSCL
其中CSRQ,CSCL为表B中CSRQ不大于表A中RQ的第一条记录的数据。
请教大神们这条SQL语句怎么写啊??
SELECT A.ID, A.RQ, A.CL, B.CSRQ, B.CSCL
FROM tableA A
LEFT JOIN (
SELECT ID, CSRQ, CSCL
FROM tableB
WHERE (ID, CSRQ) IN (
SELECT ID, MAX(CSRQ)
FROM tableB
GROUP BY ID
)
) B
ON A.ID = B.ID AND B.CSRQ <= A.RQ
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;
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
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
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对结果进行排序,以便查看结果时更加清晰