2017-05-02 9 views
-1

私はリストに使用するテーブルを持っていますが、私はこのテーブルからspesific order_keyの最高の日付を今から探しています。selectステートメントの最大日付

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 
+0

日付を文字列として保存することはお勧めできません。 – Jens

+0

その行だけをフィルタリングするルールは何ですか? – axiac

+0

はい、その1つだけです –

答えて

1

を取りますこのようなことを試すことができます。

SELECT 
     LIST_DESCRIPTION, 
     ID 
    FROM 
     (
     SELECT 
      TO_CHAR(TO_DATE(T.LIST_DESCRIPTION,'DD.MM.YYYY')) LIST_DESCRIPTION, 
      T.ID, 
      ROW_NUMBER() OVER (ORDER BY TO_DATE(T.LIST_DESCRIPTION, 
      'DD.MM.YYYY') DESC) RNK 
     FROM 
      VW_TA04_BAG_5B T 
     WHERE 
      BAC_ORDER = '00010001' 
    ) 
    WHERE 
     RNK=1; 
+0

私は同じ結果を得ました –

+0

今すぐ試す......... – Avi

+0

私は正しい結果を得て、完璧に動作します。 –

1

注文レコードとしてのみたいとOracleでのみ最初の

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 
+0

エラーメッセージが表示されます。sqlコマンドが正しく終了していません –

+0

クエリはMySQLで正しいです。残念ながら、実際に[tag:oracle]を使用しているとき、OPは質問を[tag:mysql]とタグ付けしました。 – axiac

+0

申し訳ありませんが、私は今、見習いとして働き始め、それは両方のために同じであることを確かめました。 –

2

質問は不明です。どうやらあなただけのライン

03-MAY-18 5 

取得したい「なぜなら今年のを、03-かもしれ-18は、1年後です」。これは、list_Description列に日付が最も大きい行が必要であることを意味します。

これにはGROUP BYは必要ありません。 1行の制限と組み合わせるシンプル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 
+0

ありがとうございました。私が欲しかったのはどこですか(where句はmissigです)。ありがとう –

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のための2つの行がまったく同じ日付持っている場合に発生したいかを検討する必要がある(または文字列を!)

0

は、Oracle 12Cを使用している場合は、ちょうどあなたの結果を注文しONLY

先頭の行を取得
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; 
関連する問題