Поделиться через


GROUP BY (запрос NoSQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Предложение GROUP BY разделяет результаты запроса по значениям одного или нескольких указанных свойств.

Синтаксис

<group_by_clause> ::= GROUP BY <scalar_expression_list>

<scalar_expression_list> ::=
          <scalar_expression>
        | <scalar_expression_list>, <scalar_expression>

Аргументы

Description
<scalar_expression_list> Указывает выражения, используемые для группирования (или деления) результатов запроса.
<scalar_expression> Допускается любое скалярное выражение за исключением вложенных запросов и статистических выражений. Каждое скалярное выражение должно содержать ссылку хотя бы на один столбец. Количество отдельных выражений или кратность каждого выражения не ограничивается.

Примеры

В примерах этого раздела используется этот ссылочный набор элементов. Каждый элемент содержит capabilities объект, который может включать softwareDevelopment и mediaTrained свойства.

[
  {
    "name": "Jordan Mitchell",
    "capabilities": {
      "softwareDevelopment": "python",
      "mediaTrained": true
    },
    "team": "Cloud software engineering"
  },
  {
    "name": "Mikaela Lee",
    "capabilities": {
      "softwareDevelopment": "javascript",
      "mediaTrained": false
    },
    "team": "Cloud software engineering"
  },
  {
    "name": "Graham Barnes",
    "capabilities": {
      "softwareDevelopment": "c-sharp",
      "mediaTrained": true
    },
    "team": "Cloud software engineering"
  },
  {
    "name": "Hayden Cook",
    "capabilities": {
      "softwareDevelopment": "javascript",
      "mediaTrained": true
    },
    "team": "Cloud software engineering"
  },
  {
    "name": "Morgan Connors",
    "capabilities": {
      "mediaTrained": true
    },
    "team": "Cloud software engineering"
  },
  {
    "name": "Devon Torres",
    "capabilities": {
      "softwareDevelopment": "python",
      "mediaTrained": false
    },
    "team": "Cloud software engineering"
  },
  {
    "name": "Sam Centrell",
    "capabilities": {
      "softwareDevelopment": "javascript",
      "mediaTrained": true
    },
    "team": "Cloud software engineering"
  }
]

В этом первом примере GROUP BY предложение используется для создания групп элементов с помощью значения указанного свойства.

SELECT 
    e.capabilities.softwareDevelopment AS developmentLang
FROM
    employees e
GROUP BY
    e.capabilities.softwareDevelopment
[
  {},
  {
    "developmentLang": "c-sharp"
  },
  {
    "developmentLang": "javascript"
  },
  {
    "developmentLang": "python"
  }
]

В следующем примере агрегатная системная функция (COUNT) используется с группами для предоставления общего количества элементов для каждой группы.

SELECT 
    COUNT(1) AS trainedEmployees, 
    e.capabilities.softwareDevelopment AS developmentLang
FROM
    employees e
GROUP BY
    e.capabilities.softwareDevelopment
[
  {
    "trainedEmployees": 1
  },
  {
    "trainedEmployees": 1,
    "developmentLang": "c-sharp"
  },
  {
    "trainedEmployees": 3,
    "developmentLang": "javascript"
  },
  {
    "trainedEmployees": 2,
    "developmentLang": "python"
  }
]

В этом последнем примере элементы группируются с помощью нескольких свойств.

SELECT 
    COUNT(1) AS employeesWithThisTraining, 
    e.capabilities.softwareDevelopment AS developmentLang,
    e.capabilities.mediaTrained AS mediaReady
FROM
    employees e
GROUP BY
    e.capabilities.softwareDevelopment,
    e.capabilities.mediaTrained
[
  {
    "employeesWithThisTraining": 1,
    "developmentLang": "python",
    "mediaReady": true
  },
  {
    "employeesWithThisTraining": 1,
    "developmentLang": "javascript",
    "mediaReady": false
  },
  {
    "employeesWithThisTraining": 1,
    "developmentLang": "c-sharp",
    "mediaReady": true
  },
  {
    "employeesWithThisTraining": 2,
    "developmentLang": "javascript",
    "mediaReady": true
  },
  {
    "employeesWithThisTraining": 1,
    "mediaReady": true
  },
  {
    "employeesWithThisTraining": 1,
    "developmentLang": "python",
    "mediaReady": false
  }
]

Замечания

  • Если запрос использует GROUP BY предложение, SELECT предложение может содержать только подмножество свойств и системных функций, включенных в GROUP BY предложение. Одним из исключений является агрегатные функции, которые могут отображаться в SELECT предложении GROUP BY без включения в предложение. Вы также можете включать литеральные значения в SELECT предложение.
  • Предложение GROUP BY должно быть после SELECTпредложения , FROMи WHERE предложения и перед предложением OFFSET LIMIT . Нельзя использовать GROUP BY с предложением ORDER BY .
  • Предложение GROUP BY не разрешает какие-либо из следующих функций, свойств или функций:
    • Псевдонимы свойств или системные функции псевдонима (псевдоним по-прежнему разрешен в предложении SELECT )
    • Подзапросы
    • Агрегатные системные функции (эти функции разрешены только в предложении SELECT )
  • Запросы с агрегатной системной функцией и вложенным запросом GROUP BY не поддерживаются.
  • Межсекционные GROUP BY запросы могут иметь не более 21 системных функций.