Sdílet prostřednictvím


GROUP BY (dotaz NoSQL)

PLATÍ PRO: NoSQL

Klauzule GROUP BY rozdělí výsledky dotazu podle hodnot jedné nebo více zadaných vlastností.

Syntaxe

<group_by_clause> ::= GROUP BY <scalar_expression_list>

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

Argumenty

Popis
<scalar_expression_list> Určuje výrazy, které se používají k seskupení (nebo dělení) výsledků dotazu.
<scalar_expression> Jakýkoli skalární výraz je povolený s výjimkou skalárních poddotazů a skalárních agregací. Každý skalární výraz musí obsahovat alespoň jeden odkaz na vlastnost. Počet jednotlivých výrazů ani kardinalita jednotlivých výrazů není nijak omezen.

Příklady

V příkladech v této části se používá tato referenční sada položek. Každá položka obsahuje capabilities objekt, který může obsahovat softwareDevelopment a mediaTrained vlastnosti.

[
  {
    "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"
  }
]

V tomto prvním příkladu GROUP BY se klauzule používá k vytvoření skupin položek pomocí hodnoty zadané vlastnosti.

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

V tomto dalším příkladu se pomocí agregační systémové funkce (COUNT) se seskupováním poskytne celkový počet položek na skupinu.

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

V tomto posledním příkladu jsou položky seskupené pomocí více vlastností.

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
  }
]

Poznámky

  • Pokud dotaz používá GROUP BY klauzuli, SELECT může klauzule obsahovat pouze podmnožinu vlastností a systémových funkcí zahrnutých v klauzuli GROUP BY . Jednou z výjimek je agregační funkce, které se mohou objevit v SELECT klauzuli bez zahrnutí do GROUP BY klauzule. Do klauzule můžete také vždy zahrnout hodnoty literálů SELECT .
  • Klauzule GROUP BY musí být za klauzulí SELECT, FROMa WHERE před klauzulí OFFSET LIMIT . Nemůžete použít GROUP BY s klauzulí ORDER BY .
  • Klauzule GROUP BY neumožňuje žádné z následujících funkcí, vlastností nebo funkcí:
    • Vlastnosti aliasingu nebo systémové funkce aliasingu (aliasing je stále povolený v rámci SELECT klauzule)
    • Poddotazy
    • Agregační systémové funkce (tyto funkce jsou povoleny pouze v klauzuli SELECT )
  • Dotazy s agregační systémovou funkcí a poddotazem GROUP BY se nepodporují.
  • Dotazy napříč oddíly GROUP BY můžou mít maximálně 21 agregačních systémových funkcí.