使用GROUPBY的OrientDB查询

使用GROUPBY的OrientDB查询,orientdb,Orientdb,以下查询返回的行数不正确: SELECT keyName.left(keyName.indexOf('_Configuration/')) AS keyValue, address.zip AS zip, customer_map AS customerMap FROM CUSTOMERS WHERE customer_group = 'xyz' GROUP BY keyValue, customerMap, zip SELECT keyName.left(keyName.indexO

以下查询返回的行数不正确:

SELECT keyName.left(keyName.indexOf('_Configuration/')) AS keyValue, 
address.zip AS zip, 
customer_map AS customerMap 
FROM CUSTOMERS
WHERE customer_group = 'xyz' 
GROUP BY keyValue, customerMap, zip
SELECT keyName.left(keyName.indexOf('_Configuration/')) AS keyValue, 
address.zip AS zip, 
customer_map AS customerMap 
FROM CUSTOMERS 
WHERE customer_group = 'xyz' 
GROUP BY keyValue, customer_map, address.zip
其中列数据类型如下:

keyName String 
address EMBEDDEDMAP 
customer_map EMBEDDEDMAP 
但是,如果将GROUP BY更改为使用列名而不是别名,则查询将返回正确的行数:

SELECT keyName.left(keyName.indexOf('_Configuration/')) AS keyValue, 
address.zip AS zip, 
customer_map AS customerMap 
FROM CUSTOMERS
WHERE customer_group = 'xyz' 
GROUP BY keyValue, customerMap, zip
SELECT keyName.left(keyName.indexOf('_Configuration/')) AS keyValue, 
address.zip AS zip, 
customer_map AS customerMap 
FROM CUSTOMERS 
WHERE customer_group = 'xyz' 
GROUP BY keyValue, customer_map, address.zip
有趣的是,为
keyName.left(…)
使用别名不会影响GROUP BY,但会影响函数,例如:
ifnull(keyName,'ABC)作为keyValue
使查询返回不正确的行数。

请注意,第一个查询没有给出任何错误/警告,只返回不正确的行数

这是团体的预期行为吗

不幸的是,OrientDB文档没有太多关于分组依据的详细信息

查询执行流程如下:

  • 查找查询目标(首先是索引,然后在集群迭代器上回退)
  • 迭代目标并基于WHERE条件进行筛选(不包括已由索引匹配的条件)
  • 计算筛选记录上的投影
  • 应用展开和展开
  • 分组申请
  • 申请订单
  • 应用跳过和限制
你可以用

select keyValue,zip,customerMap from (SELECT keyName.left(keyName.indexOf('_Configuration/')) AS keyValue, 
address.zip AS zip, 
customer_map AS customerMap 
FROM CUSTOMERS
WHERE customer_group = 'xyz' )
GROUP BY keyValue, customerMap, zip

感谢您的回复。我应该提到,我们尝试使用select from(select…)GROUP BY keyValue、customerMap、zip,但在一个包含100000多行的表上,此查询速度非常慢-customer_GROUP列上有一个非唯一索引。如果没有外部选择,查询速度会快得多。使用分组依据的规则是什么?OrientDB doc说GroupBy只能使用一列,但它似乎可以处理多个列。是的,它可以处理多个列。你可以看到这个链接