db2 如何选择查询(如果存在)然后选择或选择另一个

c9x0cxw0  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(175)

我有一份报告看起来是这样的:
| 编号顺序|时间戳记|标识符|状态|
| - -|- -|- -|- -|
| 十二个|2021-06-23-14.00.00.232425|十一|已完成|
| 十二个|2021-06-30-18.00.00.224525|二十二个|已完成|
| 十二个|2021-07-01-01.00.00.224525|二十三个|已完成|
| 十二个|2021-08-01-01.00.00.224525|二十五个|取消了|
这是通过SQL完成的:

SELECT numberOrder, timestamp, id, status 
from order 
where status <> 'cancel'
order by id 
fetch first row only

结果返回:
| 编号顺序|时间戳记|标识符|状态|
| - -|- -|- -|- -|
| 十二个|2021-06-23-14.00.00.232425|十一|已完成|
如果我没有2个或更多订单,如何在同一个查询中仅得出取消订单的结果?如果我只有一个订单,并且状态为取消(未完成订单)。结果仅显示取消的订单。但如果我有2个以上的订单(订单1:完成,订单2:done和orders 3 = cancel)结果应该只有orders 1:已完成。
报告:
| 编号顺序|时间戳记|标识符|状态|
| - -|- -|- -|- -|
| 十二个|2021-06-23-14.00.00.232425|十一|取消了|

SELECT numberOrder, timestamp, id, status 
from order 
where (status <> 'cancel' or status = 'cancel') -- always true the condition
order by id 
fetch first row only

结果是:
| 编号顺序|时间戳记|标识符|状态|
| - -|- -|- -|- -|
| 十二个|2021-06-23-14.00.00.232425|十一|取消了|

t5fffqht

t5fffqht1#

如果您只选择一行,则按状态排序有效,

SELECT numberOrder, timestamp, id, status 
from order
order by id, status DESC
fetch first row only

如果要选择任意数量的行,只有在没有“完成”时才用取消,

SELECT numberOrder, timestamp, id, status 
from order
WHERE (status = 'done'
       or (SELECT status FROM order ORDER BY status DESC LIMIT 1) != 'done')
order by id

不确定最后一个解决方案是否是最优的,但它确实有效。

von4xj4u

von4xj4u2#

试试看:

WITH T (numberOrder, id, status) AS
(
VALUES
  (12, 11, 'done')
, (12, 22, 'done')
, (12, 23, 'done')
, (12, 25, 'cancel')

, (13, 10, 'cancel')
, (13, 11, 'cancel')
)
SELECT numberOrder, id, status
FROM
(
SELECT T.*, ROW_NUMBER () OVER (PARTITION BY numberOrder ORDER BY DECODE (status, 'cancel', 1, 0), id) AS RN_ 
FROM T
)
WHERE RN_ = 1

其结果是:
| 编号顺序|识别码|状态|
| - -|- -|- -|
| 十二个|十一|已完成|
| 十三个|10个|取消了|
如果结果超出预期,请根据上述示例数据提供正确的结果。

相关问题