在一个组中找到一个范围内的多个值

时间:2019-07-14 14:36:11

标签: sql hive hiveql

我正在使用Hive,所以是HiveQL。

我的数据看起来像这样:

placename              |  Value              |  id
A                      |  1.1                | 1
A                      |  1.05               | 2
A                      |  2                  | 3
A                      |  3                  | 4
B                      |  2                  | 1
B                      |  5                  | 2
B                      |  2.1                | 3
B                      |  7                  | 4
C                      |  1                  | 1
C                      |  2                  | 2
C                      |  3                  | 3
C                      |  17                 | 4
C                      |  17.11              | 5
C                      |  17.6               | 6 

最终,我正在尝试查找在给定范围内具有多个“值”的地名和ID的列表。

我不确定-我不是SQL专家,也无法访问组织中的任何人。

例如

如果我有一个参数valuerange,我想查找在另一个值的valuerange中有多个Value的所有地名和id。因此,在valuerange为0.5的情况下,我将返回:

  • A-1
  • A-2
  • B-1
  • B-3
  • C-4
  • C-5
  • C-6

因为A具有1.1和1.05-彼此之间在0.5之内,对于B和C依此类推。B-1和B -3在这里是因为2.1和2的值在0.5之内。

因为17、17.11、17.6在0.5以内,所以发现C -4,5、6。 17在17.11的0.5以内,而17.6在17.11的0.5以内。

1 个答案:

答案 0 :(得分:2)

您需要表的自连接以及ON子句中valuerange的条件:

timestamp

或带有EXISTS:

select distinct t.placename, t.id 
from tablename t inner join tablename tt 
on t.placename = tt.placename  
where t.id <> tt.id and tt.value between t.value - 0.5 and t.value + 0.5
order by t.placename, t.id

请参见demo(用于SQL Server,但是由于代码是标准SQL,我想它也适用于Hive)。
结果:

select distinct t.placename, t.id 
from tablename t 
where exists (
  select 1 from tablename
  where placename = t.placename and id <> t.id 
  and value between t.value - 0.5 and t.value + 0.5  
)
order by t.placename, t.id