我有下表:(请注意,目标仅用于说明)
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
,我得到{{ 1}}
现在,我想更改该查询,以便我可以一次提供多个要查询的输入-(如果可能的话)(记录的顺序无关紧要,我只需要最新的 记录。)
我的目标是这样的
7
我想将其中的50个调用合并为一个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?
语句。
SELECT
总共50行都是不可选择的。
(这将在带有DB2的COBOL程序中)
答案 0 :(得分:0)
我不是DB2专家,但是据我所知,它支持ROW_NUMBER()
,这是接近“ greatest-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
答案 1 :(得分:0)
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”的表的每一行,使用传递的“ parameters”执行括号内的相应选择语句。在那里使用“排序依据”和“首先获取”子句来选择所需的行。