2016-08-19 9 views
0

異なる必要があり、このようなテーブルA:文字(AB、BC、CD)のペアに対して1つの日付=「9999-12-31」の場合列のグループから最大値を表示する方法。最大値は、私が持っているパターン

ID | L1 |L2 | Date   
-- |----- |---- | --------- 
1 | A | B | 2003-01-01 
---|------|-----|---------- 
2 | A | B | 2004-05-01 
---|------|-----|---------- 
3 | B | C | 2003-01-01 
---|------|-----|----------- 
4 | B | C | 9999-12-31 
---|------|-----|----------- 
5 | C | D | 1998-02-03 
---|------|-----|----------- 
6 | C | D | 2004-05-01 

ノーマルな状況があります。だから2組の文字(AB、CD)については、 '9999-12-31' の日付が間に合わず、これらの文字とIDを見るためにクエリを書く必要があります。

私はこのクエリは、正しい行を示していますが、私はまた、IDを確認する必要があり、これは私が行うことができなかったものです

select distinct L1, L2, max(date) from A GROUP BY 
L1, L2 
having max(date)<>'9999-12-31' 

(文字のペアの最大の日付を参照する)のようなクエリを書きました。誰もIDを参照するためにクエリを書く方法を知っていますか? IDは常にユニークです

ありがとう!!

+0

これははっきりしません。だから少なくとも1行に9999の日付があるので、B、Cを削除します。これは明らかです。しかし、A、Bの場合は両方の行が必要ですか、または最も日付の高い行だけが必要ですか? C、Dと同じです。 – mathguy

+0

date = '9999-12-31'のないこのペアの文字の最高の日付をクエリに表示したいとします。クエリの結果では、A、B、C、Dの両方に最高の日付を持つ必要があります。 –

答えて

0

not existsをお試しください:

select a.* 
from a a 
where not exists (select 1 
        from a a2 
        where a2.l1 = a.l1 and a2.l2 = a.l2 and 
         a2.date = '9999-12-31' 
       ); 

これは、「日付」欄に文字列として格納されていることを前提とし、または(あなたのサンプルクエリによって提案されたもの)日付形式の設定はとても'9999-12-31'が正しく解釈されていること。そうでなければ、使用することができます。

a2.date = date '9999-12-31' 

EDIT:あなたは最大を持っていないl1/l2`コンボのための最高の日にしたい場合は

、それは簡単です:

select l1, l2, max(date) 
from a 
group by l1, l2 
having max(date) < date '9999-12-31'; 
+0

私の神経にある1つの質問..あなたはお金を受け取っていますか?あなたの仕事は何ですか?ここに答える?私はあなたがここにいるので、それを言っています..あなたの仕事はここにあるのですか? – stack

+0

@RGSあなたは彼の答えの大きなフォロワーですか? Heh ..データベースについての質問をすると、彼の答えは**だけ待っていて、私は彼の答えをドキュメントに頼っている。だから、私はあなたよりももっと信者だと思う。しかし、あなたは知っています?それは奇妙です。なぜ彼はここに多くの時間を費やしていますか?彼がここで活性化するのにどのようなメリットがありますか? – stack

+0

こんにちはゴードン!ご質問ありがとうございますが、日付= 9999-12-31のないL1、L2のすべての日付が表示されるため、タスクの基準を満たしていませんが、これらの日付の最高値を確認する必要がありますペアにdate = 9999-12-31がありません....このようなsometingの書き方を知っていますか? –

1

Gordonは、日付が9999-12-31でないペアL1、L2のすべての行が必要な場合は、ソリューションを提供しました。

日付が9999-12-31でないペアL1、L2のみを探していて、そのペアの場合、最新の日付の行のみが必要だった場合のソリューションです。

with 
    table_A (id, l1, l2, dt) as (
     select 1, 'A', 'B', date '2003-01-01' from dual union all 
     select 2, 'A', 'B', date '2004-05-01' from dual union all 
     select 3, 'B', 'C', date '2003-01-01' from dual union all 
     select 4, 'B', 'C', date '9999-12-31' from dual union all 
     select 5, 'C', 'D', date '1999-02-03' from dual union all 
     select 6, 'C', 'D', date '2004-05-01' from dual 
    ) 
select id, l1, l2, dt 
from (
     select id, l1, l2, dt, 
       row_number() over (partition by l1, l2 order by dt desc) rn 
     from table_A 
    ) 
where rn = 1 
and dt != date '9999-12-31' 
; 

    ID L1 L2 DT     
------ -- -- ------------------- 
    2 A B 2004-05-01 00:00:00 
    6 C D 2004-05-01 00:00:00 
+0

ご返信ありがとうございます。しかし、テーブルAの値は(CTEの)ハードコードされているため、私はあなたのソリューションを適用することはできません。私が提供しているテーブルは、実際のテーブルの "サンプル"です。私の実際のテーブルには5百万以上の行があり、4列の組み合わせが多すぎます。あなたのような質問を書くことはできません...あなたは他のアイデアはありますか?何らかのダイナミック(ハードコーディングされていない)ソリューションですか? –

+0

独自のテーブルをお持ちの場合は、私のソリューションから 'table_A'は必要ありません。クエリは 'select id、l1、l2、dt ... 'で始まります。テーブルが' table_A'であることを確認してください。そうでない場合は、FROM条件で名前を変更してください。作成したCTEは、テストデータを追加する非常に一般的な方法ですが、ソリューションの一部ではありません。 – mathguy

+0

ok。必要な解決策がどのように見えるかをご存じですか? –

関連する問題