Максимальное значение Dynamodb

Я использую Dynamodb. У меня есть простая таблица сотрудников с такими полями, как идентификатор, имя, зарплата, додж и т. д. Что эквивалентно запросу select max(salary) from employee в dynamodb?


person arunapavan    schedule 22.06.2016    source источник


Ответы (3)


Вы можете смоделировать свою схему примерно так:

  • employee_id, как ключ раздела
  • salary, как ключ сортировки таблицы или локального вторичного индекса.

Затем Query ваша таблица для данного employee_id, с ScanIndexForward как false, и выберите первую возвращенную запись. Поскольку все строки с номером employee_id хранятся в отсортированном виде, первой записью в порядке убывания будет строка с наибольшим значением salary.

Вы также можете оставить Limit равным 1, и в этом случае DynamoDB вернет только одну запись.

Соответствующая документация здесь.

person ketan vijayvargiya    schedule 22.06.2016
comment
Привет, @ketan.. спасибо за ваш ответ... я создал индекс для emoployee_name и зарплаты в качестве ключа сортировки и запросил как response = table.query( IndexName = 'Emp_Name-Salary-index', Limit = 1, ScanIndexForward = False, )... но это дает мне ошибку, так как необходимо использовать ключевое выражение. Я новичок в динамо. Пожалуйста, помогите мне, где я пропал. - person arunapavan; 23.06.2016
comment
Вы не указали employee_id. Поставь это тоже - person ketan vijayvargiya; 23.06.2016
comment
Кажется, это вернет только максимальную зарплату на сотрудника. Исходный SQL-запрос предназначен для «глобального максимума». - person tedder42; 01.07.2018
comment
@ketanvijayvargiya отличное замечание о лимите. Это значительно повышает производительность запроса. - person RredCat; 19.11.2018
comment
Я могу подтвердить слова @tedder42. Если вы хотите получить глобальный максимум с помощью этого метода, вам придется добавить поле с одинаковым значением для всех записей в вашей таблице (или, если у вас уже есть поле, одинаковое для всех записей, используйте его), а затем введите глобальный вторичный индекс, который использует недавно введенное постоянное поле в качестве ключа HASH и зарплату в качестве ключа RANGE. Оттуда можно выполнить шаги, описанные в этом решении. Обязательно используйте созданный глобальный вторичный индекс при запросе! - person Zeust the Unoobian; 02.10.2019

В Dynamodb нет дешевого способа добиться этого. Не существует встроенной функции для определения максимального значения атрибута без извлечения всех элементов и расчета программным путем.

person notionquest    schedule 22.06.2016
comment
Есть ли другой способ получить тот же результат? Делать индексированный запрос заранее или около того? - person Emil Vikström; 22.06.2016

Не уверен насчет boto3, но inboto можно запустить таким образом

from boto.dynamodb2.table import Table

table = Table("employee")
values = list(table.query_2(reverse=True, limit=1))
MAXVALUE = values[0][salary]
person sameera sy    schedule 22.06.2016