db2 SQL:如何选择最早的日期行

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

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

SELECT numberOrder, timestamp, id, status 
from order 
where status = 'done'

我希望报表只显示最旧的行:
| 编号顺序|时间戳记|标识符|状态|
| - -|- -|- -|- -|
| 十二个|2021-06-23-14.00.00.232425|十一|已完成|

SELECT numberOrder, timestamp, id, status 
from order 
WHERE timestamp = (select TOP 1 timestamp FROM order by timestamp)
  and status = 'done'`

有什么想法吗?我试着使用min()。任何帮助都是感激的,有什么想法,如果我没有找到任何状态完成,然后找到状态取消?
如果我们找不到任何完成状态,我希望报告只显示取消行:
| 编号顺序|时间戳记|标识符|状态|
| - -|- -|- -|- -|
| 十二个|2021-06-23-14.00.00.232425|十一|取消了|

l3zydbqr

l3zydbqr1#

诚然,我不熟悉DB2,但我建议使用下面的代码来按时间戳对行进行排序,并获取第一行(最早的)。

select numberOrder, timestamp, id, status 
from order 
where status = 'done'
order by timestamp
fetch first 1 rows only
bbuxkriu

bbuxkriu2#

请尝试以下查询。
如果删除了组注解/* */,则可以按原样运行该语句。
不带该组注解的语句只对基本“表”MYTAB中状态为cancel的行有效。您可以在VALUES中用“cancel”注解掉该行,用“done”取消注解该行,以获取基本“表”中状态为done的所有行。或者用原始表的任何内容构造基本“表”。
您不必编辑查询即可获得两个结果。
其思想是枚举两种状态类型中的行row。所有状态中的第一行(按时间戳排序)的顺序是done行在cancel行之前。最后,我们只得到第一行。

WITH 
/*
  MYTAB0 (numberOrder, timestamp, id) AS
(
  VALUES
    (12, '2021-06-23-14.00.00.232425', 11)
  , (13, '2021-06-30-18.00.00.224525', 22)
  , (14, '2021-07-01-01.00.00.224525', 23)
)
, MYTAB AS
(
SELECT *
FROM MYTAB0, 
(
VALUES
'cancel'
--'done'
) S (STATUS)
)
, 

* /

T AS
(
  SELECT T.*, ROW_NUMBER () OVER (PARTITION BY STATUS ORDER BY TIMESTAMP) AS RN_
  FROM MYTAB T
  WHERE STATUS IN ('done', 'cancel')
)
SELECT numberOrder, timestamp, id, status
FROM T
WHERE RN_ = 1
ORDER BY DECODE (status, 'done', 0, 1)
FETCH FIRST 1 ROW ONLY

相关问题