sql >> データベース >  >> RDS >> Oracle

トップ1のOracle結合条件

    あなたの例では、どのレコードが必要かはまだわかりません。いくつかの選択肢を紹介します。

    問題の説明から、入手可能なものの最新の発効日が必要であると収集しました。関係があるため、max()を使用することはできません (すでに述べたように)、およびrow_number() 行く方法です:

    with cte as (
      select
        addrid, effectdt, xpirdt,
        row_number() over (partition by addrid order by effectdt desc) as rn
      from addrdata
    )
    select
      addrid, effectdt, xpirdt
    from cte
    where rn = 1
    

    次の部分は、nullで私を失った場所です... 2番目の並べ替えが有効期限によるもので、null値を最新の有効期限よりも優先させたい場合は、有効期限で注文し、nulls first

    with cte as (
      select
        addrid, effectdt, xpirdt,
        row_number() over 
            (partition by addrid order by effectdt desc, xpirdt nulls first) as rn
      from addrdata
    )
    select
      addrid, effectdt, xpirdt
    from cte
    where rn = 1
    

    つまり、この行が勝者です:

    10948448    5/14/2015   <null>
    

    ただし、有効期限がない場合にのみnullを考慮したい場合は、nulls lastを使用できます。 (またはデフォルトなので省略します):

    with cte as (
      select
        addrid, effectdt, xpirdt,
        row_number() over
            (partition by addrid order by effectdt desc, xpirdt nulls last) as rn
      from addrdata
    )
    select
      addrid, effectdt, xpirdt
    from cte
    where rn = 1
    

    この男が賞を獲得したことを意味します:

    10948448    5/14/2015   5/13/2015
    

    これはrow_number()を使用するため 行が失われることはありません。各行には行番号が保証されています。それは、本当の関係がある場合、どの行が選択されるかについてのトスアップであるということだけです。ただし、有効期限がnullであるという問題によって、このアプローチで問題が発生することはありません。

    -2016年2月13日編集-

    私は始めていると思います あなたの問題を理解するために、しかし私は100%確信していません。私はあなたのコードのスニペットを私の提案と一緒に左結合で組み込みました、そして最初にnullの有効期限を持つ必要があります、そしてこれは私の次の亀裂です:

    with cte as (
      select
        addrid, effectdt, xpirdt,
        row_number() over 
            (partition by addrid order by effectdt desc, xpirdt nulls first) as rn
      from addrdata
    )
    select
      cte.addrid, effectdt, xpirdt
    from
      mbr_person mb
      left join partyxref px on
        mb.nameid = px.nameid and
        px.reftype = 'COMM'
      left join cte on
        px.refkey = cte.addrid and
        cte.rn = 1
    

    これがそれを行わないと仮定すると:

    1. null XPIRDTが優先されると言う場合、それはより最近の発効日を超えていることを意味しますか、それとも最新のEFFECTDTのタイブレーカーにすぎませんか?後者の場合、私が持っているものは機能するはずです。前者の場合、分析関数で順序を切り替える必要があります
    2. partyxrefに関しては完全に推測しています およびmbr_person テーブル。それでも問題が解決しない場合は、サンプルデータと、これら2つのテーブルを含めるための必要な出力を投稿するか、それともいじくりまわしますか?



    1. OSX、virtualenvにpipinstallを使用してMySQL-pythonをインストールする際のエラー

    2. Rails+Postgresの移行-エラーPG::UndefinedFunction:ERROR:function gen_random_uuid()が存在しないのはなぜですか?

    3. SQLServerで月曜日を週の最初の曜日として設定する方法

    4. SQLServerストアドプロシージャへの挿入時にテーブル変数のパフォーマンスが低下する