我是沙发基地的新手,我一直在浏览沙发基础文档和其他在线资源,但我无法查询我的查询。下面是数据结构和我的查询:
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"
}
我需要获取jobId,其中包含给定jobGroup和区域的最新作业信息(最大创建时间戳)(按作业组和区域分组)。
我的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
错误结果:未显示结果
期望的结果:
{
"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"
}
答案 0 :(得分:1)
如果我正确理解您的查询,可以使用“分组依据”和无联接来回答。我尝试输入您的示例数据,以下查询给出了正确的结果:
select max([created,d])[1] max_for_group_region
from default d
group by jobGroup, region;
它是如何工作的?它使用'group by'按jobGroup和region对文档进行分组,然后为组中的每个文档创建一个两元素数组:
然后在2元素数组的集合上应用max函数。一组数组的最大值在第一个数组位置中查找最大值,如果在第二个位置存在平局,则依此类推。在这种情况下,我们将获得具有最大时间戳的双元素数组。
现在我们有一个数组[timestamp,document],所以我们应用[1]来提取文档。
答案 1 :(得分:0)
我在你的例子中看到了一些不一致和无效的JSON,所以我会尽我所能。首先,我使用Couchbase Server 5.5,它提供了新的ANSI JOIN语法。可能有一种方法可以在早期版本的Couchbase Server中执行此操作。
接下来,我在created
字段上创建了一个索引:CREATE INDEX ix_created ON bucketname(created)
。
然后,我使用子查询来获取最新日期,由jobGroup和region聚合。然后我将此查询中的最新日期加入到整个存储桶中,并选择您想要的字段(我认为):
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,您可能需要考虑在Couchbase N1QL Forums中询问更专业的答案。