2016-10-12 62 views
0

我有2个经纬度为ORACLE常见位置的表格,我正在计算这两个位置之间的距离并基于它计算坚持报告。我想选择distict VISITOR_ID行,优先考虑具有Adherence的访问者为'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优先考虑粘附= 'N':

enter image description here

+0

请张贴数据格式的文本,没有图像 – Aleksej

+0

如果什么对于给定的ID没有行与坚持= N?以及如何在具有相同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;