首页 文章

couchbase N1ql查询选择非分组字段

提问于
浏览
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"
}

我需要获取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"
}

2 回答

  • 0

    如果我正确理解您的查询,可以使用“分组依据”和无联接来回答 . 我尝试输入您的示例数据,以下查询给出了正确的结果:

    select max([created,d])[1] max_for_group_region from default d group by jobGroup, region;

    它是如何工作的?它使用'group by'按jobGroup和region对文档进行分组,然后为组中的每个文档创建一个两元素数组:

    • 'created' timestamp字段

    • 时间戳来自的文档

    然后它在2元素数组的集合上应用max函数 . 一组数组的最大值在第一个数组位置中查找最大值,如果在第二个位置存在平局,则依此类推 . 在这种情况下,我们得到具有最大时间戳的双元素数组 .

    现在我们有一个数组[timestamp,document],所以我们应用[1]来提取文档 .

  • 1

    我在你的例子中看到了一些不一致和无效的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 5.5,目前处于测试阶段 .

    如果您使用的是不同版本的Couchbase Server,您可能需要考虑在Couchbase N1QL Forums中寻求更专业的答案 .

相关问题