选择语句最大日期

时间:2017-05-02 11:24:44

标签: sql oracle

我有一张表用于列表,我现在希望从这张表中的特定order_key获得最高日期。

  SELECT to_char(max(to_date(list_description,'DD.MM.YYYY'))) list_Description, id
  from VW_TA04_BAG_5B
  where bac_order = '00010001'
  group by id

这是我的结果

 20-MAR-17  1
    08-MAR-17   2
    06-JUN-17   3
    02-MAY-18   4
    03-MAY-18   5

但我只希望这个作为我的输出

03-MAY-18   5

5 个答案:

答案 0 :(得分:2)

问题不明确。显然你只想得到这条线

03-MAY-18   5

“因为这一年,03年5月18日是一年后”。我想这意味着您需要list_Description列中具有最长日期的行。

您不需要GROUP BY。一个简单的ORDER BY list_Description DESC加上一行的限制就足够了(并且运行得更快):

SELECT to_char(list_Description), id
FROM (
    SELECT to_date(list_description,'DD.MM.YYYY') list_Description, id
    FROM VW_TA04_BAG_5B
    WHERE bac_order = '00010001'
    ORDER BY list_Description DESC
)
WHERE ROWNUM <= 1

答案 1 :(得分:1)

订购记录并仅采取第一个

  SELECT to_char(max(to_date(list_description,'DD.MM.YYYY'))) list_Description, id
  from VW_TA04_BAG_5B
  where bac_order = '00010001'
  group by id
  order by id desc
  limit 1

答案 2 :(得分:1)

在Oracle中你可以尝试这样的事情。

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mSubscription != null && !mSubscription.isUnsubscribed()) 
        mSubscription.unsubscribe();
}

答案 3 :(得分:1)

另一种变体,使用keep last

select max(to_date(list_description,'DD.MM.YYYY')) as list_description,
  max(id) keep (dense_rank last order by to_date(list_description,'DD.MM.YYYY')) as id
from VW_TA04_BAG_5B
where bac_order = '00010001';

LIST_DESC         ID
--------- ----------
03-MAY-18          5

这个(以及其他答案)假设您将日期存储为字符串,这是糟糕的设计。如果list_description实际上是一个日期 - 这个名称似乎不太可能 - 那么你正在进行隐式转换,这可能会在不同的环境中中断,而你只需要这样做:

select max(list_description) as list_description,
  max(id) keep (dense_rank last order by list_description) as id
from VW_TA04_BAG_5B
where bac_order = '00010001';

无论如何,如果BACS ID的两行具有完全相同的日期(或字符串!),您至少需要考虑要发生的事情。

答案 4 :(得分:0)

如果您使用的是Oracle 12C,那么只需订购结果并仅获取FETCH第一行

  SELECT TO_CHAR(MAX(TO_DATE(list_description,'DD.MM.YYYY'))) list_Description, id
  FROM VW_TA04_BAG_5B
  WHERE bac_order = '00010001'
  GROUP BY id
  ORDER BY list_Description DESC
  FETCH FIRST ROW ONLY;