Выборка запроса couchbase N1ql по группам по группам - PullRequest
0 голосов
/ 08 мая 2018

Я новичок в 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, в котором содержится самая последняя информация о задании (макс. Для созданной метки времени) для заданной группы и региона (группа по группам и регионам).

Мой 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 голосов
/ 08 мая 2018

Если я правильно понимаю ваш запрос, на него можно ответить, используя 'group by' и без объединения. Я попытался ввести данные примера, и следующий запрос дает правильный результат:

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

Как это работает? Он использует 'group by' для группировки документов по группам заданий и регионам, а затем создает массив из двух элементов для каждого документа в группе:

  • «созданное» поле отметки времени
  • документ, из которого пришла метка времени

Затем он применяет функцию max к множеству 2-элементных массивов. Максимум набора массивов ищет максимальное значение в первой позиции массива, и, если есть связь, просматривает вторую позицию и так далее. В этом случае мы получаем массив из двух элементов с максимальной отметкой времени.

Теперь у нас есть массив [timestamp, document], поэтому мы применяем [1] для извлечения только документа.

0 голосов
/ 08 мая 2018

Я вижу некоторые несоответствия и недопустимый JSON в ваших примерах, поэтому я сделаю все возможное. Прежде всего, я использую Couchbase Server 5.5, который обеспечивает новый синтаксис ANSI JOIN. Может быть способ сделать это в более ранней версии Couchbase Server.

Затем я создал индекс в поле created: CREATE INDEX ix_created ON bucketname(created).

Затем я использую подзапрос, чтобы получить самую последнюю дату, агрегированную по группам заданий и регионам. Затем я присоединяю последнюю дату из этого запроса ко всей корзине и выбираю поля, которые (я думаю) вы хотите получить в желаемом результате:

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 более экспертный ответ.

...