提前致谢:请考虑以下表格:
Table 1: matrix_data
Matrix_ID Data_ID DATE(Date) Info(varchar)
1 1 3000 A
1 1 3500 B
1 2 3600 C
1 2 3700 D
2 1 3100 E
2 1 3400 F
2 2 3450 G
2 2 3750 H
3 1 3000 I
3 1 3500 J
3 2 3620 K
3 2 3700 L
4 1 3100 M
4 1 3400 N
4 2 3450 O
4 2 3750 P
Table 2: Result_Query
Result_ID Matrix_ID
22 1
22 3
鉴于以下内容 -
A Date (for example - 3640)
A Data_ID (For example - 2)
A Result_ID (For example - 22)
我需要一个查询,它会为每个具有与Result_ID(22)对应的记录的Matrix_id返回一行。 对于与提供的Data_ID(2)匹配的记录,该行应包含最大DATE< =提供日期(3640)的记录。
For the example provided, the result would be :
Matrix_ID Data_ID DATE Info(varchar)
1 2 3600 C
3 2 3620 K
我无法更改表格。这是一个小例子,但我可能在Result_ID中有5000个Matrix ID,因此id喜欢这样做,而不会为每个记录执行数据库操作。 存储过程是一个选项,如果我可以用直接sql做得更好。 我正在与oracle合作。 DATE是日期列而不是数字。再次感谢 -
到目前为止 - 我正试图简化问题而只是做:
select *
from ( select b.* , rank() over ( partition by data_id, matrix_id order by DATE desc ) rnk
from matrix_data b )
where rnk = 1
我现在需要折叠剩余的约束
答案 0 :(得分:1)
一个简单的小组就足够了。
SELECT d.matrix_id, d.data_id, MAX(d.the_date) FROM matrix_data d
INNER JOIN result_query q ON q.matrix_id = d.matrix_id
WHERE d.data_id = ?
AND q.result_id = ?
AND d.the_date <= ?
GROUP BY d.matrix_id, d.data_id;
要包含info
,您需要查询此查询:
WITH q1 AS
(SELECT d.matrix_id, d.data_id, MAX(d.the_date) AS maxdate FROM matrix_data d
INNER JOIN result_query q ON q.matrix_id = d.matrix_id
WHERE d.data_id = ?
AND q.result_id = ?
AND d.the_date <= ?
GROUP BY d.matrix_id, d.data_id)
SELECT q1.*, d.info FROM matrix_data d
INNER JOIN q1 ON q1.matrix_id = d.matrix_id
AND q1.maxdate = d.the_date
AND q1.data_id = d.data_id;
答案 1 :(得分:0)
到目前为止看似有效的解决方案:
有什么方法可以优化?
SELECT Matrix_ID, Data_ID, DATE, Info
FROM ( SELECT M.*, rank() OVER ( PARTITION BY matrix_id, data_id ORDER BY DATE DESC ) rnk FROM matrix_data M
JOIN RESULT_QUERY Q ON M.MATRIX_ID = Q.MATRIX_ID
WHERE Q.RESULT_ID = 22
AND M.DATE <= to_date('12/20/1909','mm/dd/yyyy') )
WHERE rnk = 1;