2017-08-07 68 views
0

假设我有一个表如之间的距离:得到N行

ID,visit, Concentration 
1, 1, 4.0 
2, 2, 2.0 
3, 3, 1.5 
4, 4, 5.0 
5, 1, 7.0 
6, 2, 1.0 
7, 3, 5.0 
8, 4, 12.0 

该表具有的4个浓度2个亚组(该分区按id制成,访问)。在每个组中,我想遍历所有4个浓度并返回两个id,根据浓度访问最近的一个。

所以查询将返回一个结果,像这样的:

ID, visit, concentration 
2, 2, 2.0 
3, 3, 1.5 
5, 1, 7.0 
7, 3, 5.0 

感谢

+0

你看了SQL窗口函数?您可能会这样做的方式是根据需要使用RANK或DENSE_RANK。 – RHP

+0

我不明白这个问题。你能提供更多解释吗? –

回答

0

您可以分配组以不同的方式。假设所有大小都相同,则可以按照ID的顺序枚举访问次数。然后,我认为这是最简单的返回每行一对:

with g as (
     select t.*, row_number() over (partition by visit order by id) as grp 
     from t 
    ) 
select * 
from (select g1.id as id1, g1.visit as visit1, g1.concentration as concentration1, 
      g2.id as id2, g2.visit as visit2, g2.concentration as concentration2 
      row_number() over (partition by g1.grp 
           order by abs(g1.concentration - g2.concentration) 
           ) as seqnum 
     from g g1 join 
      g g2 
      on g1.grp = g2.grp and g1.id < g2.id 
    ) g 
where seqnum = 1;