couchbase N1ql 查询 select 具有非按字段分组
couchbase N1ql query select with non-group by fields
我是 couchbase 的新手,我浏览 couchbase 文档和其他在线资源已经有一段时间了,但我的查询无法正常工作。下面是数据结构和我的查询:
Table1:
{
"jobId" : "101",
"jobName" : "abcd",
"jobGroup" : "groupa",
"created" : " "2018-05-06T19:13:43.318Z",
"region" : "dev"
},
{
"jobId" : "102",
"jobName" : "abcd2",
"jobGroup" : "groupa",
"created" : " "2018-05-06T22:13:43.318Z",
"region" : "dev"
},
{
"jobId" : "103",
"jobName" : "abcd3",
"jobGroup" : "groupb",
"created" : " "2018-05-05T19:11:43.318Z",
"region" : "test"
}
我需要获取给定 jobGroup 和区域(按 jobGroup 和区域分组)的最新作业信息(创建时间戳的最大值)的 jobId。
我的 sql 查询无法帮助我在 jobId 上使用自联接。
查询:
/*
想法是为所有可能的组和区域提取最新执行的作业,并打印该特定作业的详细信息
select * from (select max(DATE_FORMAT_STR(j.created,'1111-11-11T00:00:00+00:00')) as latest, j.jobGroup, j.region from table1 j
group by jobGroup, region) as viewtable
join table t
on keys meta(t).id
where viewtable.latest in t.created and t.jobGroup = viewtable.jobGroup and
viewtable.region = t.region
Error Result: No result displayed
期望的结果:
{
"jobId" : "102",
"jobName":"abcd2",
"jobGroup":"groupa",
"latest" :"2018-05-06T22:13:43.318Z",
"region":"dev"
},
{
"jobId" : "103",
"jobName" : "abcd3",
"jobGroup" : "groupb",
"created" : " "2018-05-05T19:11:43.318Z",
"region" : "test"
}
我在您的示例中发现了一些不一致和无效的地方 JSON,所以我将尽我所能。首先,我使用的是 Couchbase Server 5.5,它提供了新的 ANSI JOIN 语法。在较早版本的 Couchbase Server 中可能有一种方法可以做到这一点。
接下来,我在created
字段上创建了一个索引:CREATE INDEX ix_created ON bucketname(created)
。
然后,我使用子查询获取最新日期,按 jobGroup 和地区汇总。然后我将此查询的最新日期加入到整个存储桶和 select 您想要的字段(我认为)在您想要的结果中:
SELECT k.jobId, k.jobName, k.jobGroup, k.created AS latest, k.region
FROM (
SELECT j.jobGroup, j.region, MAX(j.created) as latestDate
FROM so j
GROUP BY j.jobGroup, j.region
) dt
LEFT JOIN so k ON k.created = dt.latestDate;
这种方法的问题:
- 如果两个文档的日期完全相同,这不是确定最新日期的可靠方法。您可以向子查询添加一个
LIMIT 1
,这将任意选择一个,或者您可以 ORDER BY
无论您喜欢什么。
- 子查询性能:我不知道您的数据集有多大,但这可能会很慢。
- 需要 Couchbase Server 5.5,目前处于测试阶段。
如果您使用的是不同版本的 Couchbase Server,您可能需要考虑在 Couchbase N1QL Forums 中询问更专业的答案。
如果我对您的查询的理解正确,可以使用 'group by' 和不加入来回答。我尝试输入您的示例数据,以下查询给出了正确的结果:
select max([created,d])[1] max_for_group_region
from default d
group by jobGroup, region;
它是如何工作的?它使用 'group by' 按 jobGroup 和区域对文档进行分组,然后为组中的每个文档创建一个包含两个元素的数组:
- 'created' 时间戳字段
- 时间戳来自的文档
然后它对 2 元素数组集应用 max 函数。一组数组的最大值在第一个数组位置查找最大值,如果有平局则在第二个位置查找,依此类推。在这种情况下,我们将获得具有最大时间戳的二元数组。
现在我们有一个数组 [timestamp, document],因此我们应用 [1] 来仅提取文档。
我是 couchbase 的新手,我浏览 couchbase 文档和其他在线资源已经有一段时间了,但我的查询无法正常工作。下面是数据结构和我的查询:
Table1:
{
"jobId" : "101",
"jobName" : "abcd",
"jobGroup" : "groupa",
"created" : " "2018-05-06T19:13:43.318Z",
"region" : "dev"
},
{
"jobId" : "102",
"jobName" : "abcd2",
"jobGroup" : "groupa",
"created" : " "2018-05-06T22:13:43.318Z",
"region" : "dev"
},
{
"jobId" : "103",
"jobName" : "abcd3",
"jobGroup" : "groupb",
"created" : " "2018-05-05T19:11:43.318Z",
"region" : "test"
}
我需要获取给定 jobGroup 和区域(按 jobGroup 和区域分组)的最新作业信息(创建时间戳的最大值)的 jobId。
我的 sql 查询无法帮助我在 jobId 上使用自联接。
查询:
select * from (select max(DATE_FORMAT_STR(j.created,'1111-11-11T00:00:00+00:00')) as latest, j.jobGroup, j.region from table1 j
group by jobGroup, region) as viewtable
join table t
on keys meta(t).id
where viewtable.latest in t.created and t.jobGroup = viewtable.jobGroup and
viewtable.region = t.region
Error Result: No result displayed
期望的结果:
{
"jobId" : "102",
"jobName":"abcd2",
"jobGroup":"groupa",
"latest" :"2018-05-06T22:13:43.318Z",
"region":"dev"
},
{
"jobId" : "103",
"jobName" : "abcd3",
"jobGroup" : "groupb",
"created" : " "2018-05-05T19:11:43.318Z",
"region" : "test"
}
我在您的示例中发现了一些不一致和无效的地方 JSON,所以我将尽我所能。首先,我使用的是 Couchbase Server 5.5,它提供了新的 ANSI JOIN 语法。在较早版本的 Couchbase Server 中可能有一种方法可以做到这一点。
接下来,我在created
字段上创建了一个索引:CREATE INDEX ix_created ON bucketname(created)
。
然后,我使用子查询获取最新日期,按 jobGroup 和地区汇总。然后我将此查询的最新日期加入到整个存储桶和 select 您想要的字段(我认为)在您想要的结果中:
SELECT k.jobId, k.jobName, k.jobGroup, k.created AS latest, k.region
FROM (
SELECT j.jobGroup, j.region, MAX(j.created) as latestDate
FROM so j
GROUP BY j.jobGroup, j.region
) dt
LEFT JOIN so k ON k.created = dt.latestDate;
这种方法的问题:
- 如果两个文档的日期完全相同,这不是确定最新日期的可靠方法。您可以向子查询添加一个
LIMIT 1
,这将任意选择一个,或者您可以ORDER BY
无论您喜欢什么。 - 子查询性能:我不知道您的数据集有多大,但这可能会很慢。
- 需要 Couchbase Server 5.5,目前处于测试阶段。
如果您使用的是不同版本的 Couchbase Server,您可能需要考虑在 Couchbase N1QL Forums 中询问更专业的答案。
如果我对您的查询的理解正确,可以使用 'group by' 和不加入来回答。我尝试输入您的示例数据,以下查询给出了正确的结果:
select max([created,d])[1] max_for_group_region
from default d
group by jobGroup, region;
它是如何工作的?它使用 'group by' 按 jobGroup 和区域对文档进行分组,然后为组中的每个文档创建一个包含两个元素的数组:
- 'created' 时间戳字段
- 时间戳来自的文档
然后它对 2 元素数组集应用 max 函数。一组数组的最大值在第一个数组位置查找最大值,如果有平局则在第二个位置查找,依此类推。在这种情况下,我们将获得具有最大时间戳的二元数组。
现在我们有一个数组 [timestamp, document],因此我们应用 [1] 来仅提取文档。