2016-10-12 14 views
0

私はORACLEの共通の場所の緯度と経度を持つ2つのテーブルを持っています。遵守報告書。私は、Adherenceを持つ訪問者に優先度を与えるDistict VISITOR_ID行を 'N'として選択します。以下は私が使用しているクエリであり、クエリのサンプル出力も添付してあります。クエリの個別のレコードを選択する列に基づいて、他の基準に基づいてレコードを優先する

SELECT DISTINCT rv.VISITOR_ID as VISITOR_ID, rv.VISIT_ENT_NAME as Location_Name, 

ACOS(SIN(RADIANS(rg.Latitude)) * SIN(RADIANS(rv.Latitude)) 
        + COS(RADIANS(rg.Latitude)) * COS(RADIANS(rv.Latitude)) 
        * COS(RADIANS(rg.Longitude) - RADIANS(rv.Longitude)) 
        ) * 6371 AS DISTANCE, 

(CASE WHEN ACOS(SIN(RADIANS(rg.Latitude)) * SIN(RADIANS(rv.Latitude)) 
        + COS(RADIANS(rg.Latitude)) * COS(RADIANS(rv.Latitude)) 
        * COS(RADIANS(rg.Longitude) - RADIANS(rv.Longitude)) 
        ) * 6371 < 200 THEN 'Y' ELSE 'N' END) AS Adherence 

From RANDOM_VISIT rv 
LEFT JOIN GEOTAG rg ON rv.VISITOR_ID = rg.CODE; 

結果:

enter image description here

予想結果が異なるvisitor_idを選択するが、密着性にdistint与える嗜好を選択しながら= ONであるべきである 'N'

enter image description here

+0

与えられたIDのためのアドヒアランス= Nを持つ行がどのような存在しない場合 – Aleksej

+0

画像、フォーマットされたデータをテキストとしてではない投稿してください?そして、同じIDのすべての行の中で、遵守= N – Aleksej

+0

を選択する方法は、特定のIDに従属= Nの行がない場合、別のvisitor_idが選択されます。私は別個のvisitor_idを選んでいる間に嗜好を与えるように求めました。それは、すべてのvisitor_idがAdherence = 'N'を持つという義務はありません。 –

答えて

1

単純化しようとすると、クエリがその結果を与えると仮定すると、これは必要なものを得る方法になる可能性があります。

with yourQuery (visitor_id, location_name, distance, adherence) as 
(
    select 5200, 'Mobi Shop', 0.4, 'N' from dual union all 
    select 7550, 'Sk cafe', 0.7, 'N' from dual union all 
    select 7550, 'DL General', 0.7, 'N' from dual union all 
    select 5200, 'Success Mobo', 0.1, 'Y' from dual union all 
    select 7550, 'Mack Agency', 0.9, 'N' from dual 
) 
select visitor_id, location_name, distance, adherence 
from (
     select q.*, row_number() over (partition by visitor_id order by adherence) as RN 
     from yourQuery q 
    ) 
where RN = 1 

これは、あなたが多くの行を持っている場合、同じvisitor_idadherence = 'N'で抽出した行を決定する何のロジックを持っていません。ロジックが必要な場合は、それに応じてORDER BYの部分を編集するだけです。

2

シングル(追加)、クエリのすべて - Aleksejのサンプルデータを使用して:

with yourQueryResult (visitor_id, location_name, distance, adherence) as 
(
    select 5200, 'Mobi Shop', 0.4, 'N' from dual union all 
    select 7550, 'Sk cafe', 0.7, 'N' from dual union all 
    select 7550, 'DL General', 0.7, 'N' from dual union all 
    select 5200, 'Success Mobo', 0.1, 'Y' from dual union all 
    select 7550, 'Mack Agency', 0.9, 'N' from dual 
) 
select visitor_id, 
     min(location_name) keep (dense_rank first order by adherence, distance) 
                   as location_name, 
     min(distance) keep (dense_rank first order by adherence) as distance, 
     min(adherence) as adherence 
from yourQueryResult 
group by visitor_id; 
関連する問題