SELECT唯一行的SQL /存储过程,最大日期< =提供日期

时间:2014-06-03 00:09:41

标签: sql oracle greatest-n-per-group

提前致谢:请考虑以下表格:

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

我现在需要折叠剩余的约束

2 个答案:

答案 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;