我有下表:(注意,目标仅用于说明(
a | b | TSD | target
---|----|-------|-------
a1 | b1 | 1 | 1
a2 | b1 | 1 | 2
a1 | b2 | 1 | 3
a2 | b2 | 1 | 4
a1 | b1 | 2 | 5
a2 | b1 | 2 | 6
a1 | b2 | 2 | 7
a2 | b2 | 2 | 8
现在我有一个类似的选择
SELECT target FROM tab
WHERE a = :val-A
AND b = :val-B
AND TSD <= :val-TSD
ORDER BY TSD desc
FETCH FIRST 1 ROW ONLY;
因此,对于输入a1
b1
1
,我得到1
,对于a1
b2
42
,我得到了7
现在我想更改这个查询,这样我就可以同时提供多个要查询的输入-(如果可能的话((记录的顺序无关紧要,我只需要最新的记录。(
我的目标是这样的:
SELECT a, b, target FROM tab
WHERE (a, b) in (
(:val-a1, :val-b1)
,(:val-a2, :val-b2)
-- ...
,(:val-an, :val-bn)
)
AND TSD <= :val-TSD -- How to do the < per input?
FETCH FIRST 2 ROWS ONLY; -- How to only get the newest one per input?
我想将其中的50个调用合并为一个SELECT
语句。UNION
所有50行加在一起不是一个选项。
(这将在DB2的COBOL程序中(
我不是DB2专家,但据我所见,它支持ROW_NUMBER()
,这是接近"最伟大的n-pre-group"的"常用"方式(您希望每组最多1个(
SELECT
*
FROM
(
SELECT
param.id AS param_id,
data.a,
data.b
data.TSD,
data.target,
ROW_NUMBER() OVER (PARTITION BY param.id ORDER BY data.TSD DESC) AS data_row_id
FROM
data
INNER JOIN
param
ON data.a = param.a
AND data.b = param.b
AND data.TSD <= param.TSD
)
AS results
WHERE
results.data_row_id = 1
select p.*, t.target
from param p, table(
select t.target
from tab t
where t.a=p.a and t.b=p.b and t.tsd<=p.tsd
order by t.tsd desc
fetch first 1 row only
) t;
下面是一个"参数化"子选择的示例。从逻辑上讲,它的工作原理如下:
对于带有参数"param"的表的每一行,括号内相应的select语句将使用传递的"parameters"执行。"Order by"one_answers"Fetch first"子句仅用于选择所需的行。