【问题标题】:SQL: How to select the oldest date rowSQL:如何选择最旧的日期行
【发布时间】:2022-01-12 22:54:26
【问题描述】:

我的报告看起来像这样:

numberOrder timestamp id status
12 2021-06-23-14.00.00.232425 11 done
13 2021-06-30-18.00.00.224525 22 done
14 2021-07-01-01.00.00.224525 23 done

这是通过 SQL 完成的:

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

我希望报告只显示最旧的行:

numberOrder timestamp id status
12 2021-06-23-14.00.00.232425 11 done
SELECT numberOrder, timestamp, id, status 
from order 
WHERE timestamp = (select TOP 1 timestamp FROM order by timestamp)
  and status = 'done'`

有什么想法吗?我尝试使用 min()。任何帮助表示赞赏 如果我没有找到任何状态完成然后找到状态取消有什么想法吗?

如果我们没有找到任何完成状态,我希望报告只显示取消行:

numberOrder timestamp id status
12 2021-06-23-14.00.00.232425 11 cancel

【问题讨论】:

    标签: sql if-statement select db2 where-clause


    【解决方案1】:

    尝试以下查询。
    如果删除组 cmets /* */,您可以按原样运行该语句。
    没有此组 cmets 的语句仅适用于基本“表”MYTAB 中具有cancel 状态的行。您可以用 'cancel' 注释掉该行,并在 VALUES 中取消注释带有 'done' 的行,以便仅在基本“表”中获取状态为 done 的所有行。或者使用原始表格的任何内容构建您的基本“表格”。
    您无需编辑查询即可获得这两个结果。
    这个想法是在两种状态类型中枚举行行。所有雕像中的第一行(按时间戳排序)在cancel 之前排列有done 行。最后我们只得到第一行。

    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
    

    【讨论】:

      【解决方案2】:

      诚然不熟悉 DB2,但我建议按照时间戳对行进行排序并获取第一(最旧)行。

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

      【讨论】:

      • with ties 据我所知不适用于任何 Db2 平台/版本。
      • 是的,它出现在 DB2 中,您需要使用 CTE 和排名来处理它。我将删除引用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 2012-11-06
      • 2011-05-04
      • 2011-10-24
      • 1970-01-01
      • 2015-06-21
      相关资源
      最近更新 更多