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

Sql 在一个组中查找一个范围内的多个值,sql,hive,hiveql,Sql,Hive,Hiveql,我正在使用Hive,所以使用HiveQL 我的数据看起来像是: placename | Value | id A | 1.1 | 1 A | 1.05 | 2 A | 2 | 3 A

我正在使用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中有多个值的所有地名和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以内


发现C-4、5、6是因为17、17.11、17.6在0.5范围内。17在17.11的0.5范围内,17.6在17.11的0.5范围内。

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

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

请解释B-1和C-4出现在结果中的原因。补充澄清谢谢-这看起来非常接近。我在t.id tt.id的配置单元中遇到了一个错误——“JOIN中遇到的左别名和右别名”确实是一个配置单元。这两个查询都不受支持。我正在查看,如果今天晚些时候没有得到蜂巢解决方案,我会接受您的回答,认为这是最有帮助的。请再试一次:
关于t.placename=tt.placename,其中tt.value介于t.value-0.5和t.value+0.5之间,t.id tt.id
用于第一次查询。我将BEVERY语句移到where子句。我发现:ON子句中的复杂表达式受支持,从Hive 2.2.0开始(请参阅Hive-15211,Hive-15251)。在此之前,配置单元不支持非相等条件的连接条件。因此,如果您的版本是2.2.0之前的版本,则连接不支持或之间的连接。所以把它们移到WHERE子句。太棒了,谢谢。现在运行。该片段是正确的-我运行的是2.2.0(2.1.1)之前的版本。我已经复制了结果,将接受您的答案。如果你不介意的话,我有一个快速的变体——也许是一个单独的问题。。。。如果我只想查找重复id的值在此范围内的情况(即,对于给定的地名,id不是唯一的情况-id=1,value=1,id=1,value=1.2都将返回-应多次满足该条件,即应存在多个满足给定id条件的值)
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
> placename | id
> :-------- | -:
> A         |  1
> A         |  2
> B         |  1
> B         |  3
> C         |  4
> C         |  5
> C         |  6