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