SQL 保留(dense_rank 最后一个订单)到 H2 数据库
SQL Keep (dense_rank last order by) to H2 database
我有以下 select 声明
SELECT c.car_id
MAX(m.mod_number) KEEP (DENSE_RANK LAST ORDER BY
DECODE(m.mod_number 'SP1', 10, 'SP2', 20, 'SP3', 30, 40))
FROM CAR c, MANUFACTURE m
WHERE c.car_type = m.car_type
AND m.make LIKE 'FOR%'
GROUP BY c.car_id;
我想把它改成H2语法来进行单元测试,但我只能解码。我不知道如何使用 keep (dense_rank...) 进行修改,同时保留 Oracle 的此 select 语句的功能?
我认为这可能有效:
SELECT c.car_id,
(CASE MAX(CASE WHEN m.mod_number = 'SP1' THEN 10
WHEN m.mod_number = 'SP2' THEN 20
WHEN m.mod_number = 'SP3' THEN 30
ELSE 40
END)
WHEN 10 THEN 'SP1'
WHEN 20 THEN 'SP2'
WHEN 30 THEN 'SP3'
ELSE MAX(CASE WHEN m.mod_number NOT IN ('SP1', 'SP2', 'SP3') THEN m.mod_number
END)
END)
FROM CAR c JOIN
MANUFACTURE m
ON c.car_type = m.car_type
WHERE m.make LIKE 'FOR%'
GROUP BY c.car_id;
它计算出最大优先级,然后将值映射回原始值。
最接近的等价物是这样的:
SELECT
c.car_id
SUBSTRING(
MAX(
DECODE(m.mod_number 'SP1', '10', 'SP2', '20', 'SP3', '30', '40'))
||
TO_CHAR(m.mod_number)
),
3,100) NewField
FROM CAR c, MANUFACTURE m
WHERE c.car_type = m.car_type
AND m.make LIKE 'FOR%'
GROUP BY c.car_id;
KEEP
是一种根据与您正在使用的实际记录集不同的基础(顺序)从多个记录中挑选单个记录的方法。幸运的是,这个特定的查询不一定需要它。
在尝试转换为 H2 之前先在 Oracle 中尝试此操作
我有以下 select 声明
SELECT c.car_id
MAX(m.mod_number) KEEP (DENSE_RANK LAST ORDER BY
DECODE(m.mod_number 'SP1', 10, 'SP2', 20, 'SP3', 30, 40))
FROM CAR c, MANUFACTURE m
WHERE c.car_type = m.car_type
AND m.make LIKE 'FOR%'
GROUP BY c.car_id;
我想把它改成H2语法来进行单元测试,但我只能解码。我不知道如何使用 keep (dense_rank...) 进行修改,同时保留 Oracle 的此 select 语句的功能?
我认为这可能有效:
SELECT c.car_id,
(CASE MAX(CASE WHEN m.mod_number = 'SP1' THEN 10
WHEN m.mod_number = 'SP2' THEN 20
WHEN m.mod_number = 'SP3' THEN 30
ELSE 40
END)
WHEN 10 THEN 'SP1'
WHEN 20 THEN 'SP2'
WHEN 30 THEN 'SP3'
ELSE MAX(CASE WHEN m.mod_number NOT IN ('SP1', 'SP2', 'SP3') THEN m.mod_number
END)
END)
FROM CAR c JOIN
MANUFACTURE m
ON c.car_type = m.car_type
WHERE m.make LIKE 'FOR%'
GROUP BY c.car_id;
它计算出最大优先级,然后将值映射回原始值。
最接近的等价物是这样的:
SELECT
c.car_id
SUBSTRING(
MAX(
DECODE(m.mod_number 'SP1', '10', 'SP2', '20', 'SP3', '30', '40'))
||
TO_CHAR(m.mod_number)
),
3,100) NewField
FROM CAR c, MANUFACTURE m
WHERE c.car_type = m.car_type
AND m.make LIKE 'FOR%'
GROUP BY c.car_id;
KEEP
是一种根据与您正在使用的实际记录集不同的基础(顺序)从多个记录中挑选单个记录的方法。幸运的是,这个特定的查询不一定需要它。
在尝试转换为 H2 之前先在 Oracle 中尝试此操作