GROUP BY (zapytanie NoSQL)
DOTYCZY: NoSQL
Klauzula GROUP BY
dzieli wyniki zapytania według wartości co najmniej jednej określonej właściwości.
Składnia
<group_by_clause> ::= GROUP BY <scalar_expression_list>
<scalar_expression_list> ::=
<scalar_expression>
| <scalar_expression_list>, <scalar_expression>
Argumenty
opis | |
---|---|
<scalar_expression_list> |
Określa wyrażenia używane do grupowania (lub dzielenia) wyników zapytania. |
<scalar_expression> |
Dowolne wyrażenie skalarne jest dozwolone z wyjątkiem podzapytania skalarnego i agregacji skalarnych. Każde wyrażenie skalarne musi zawierać co najmniej jedno odwołanie do właściwości. Nie ma limitu liczby pojedynczych wyrażeń ani kardynalności każdego wyrażenia. |
Przykłady
W przykładach w tej sekcji jest używany ten zestaw odwołań elementów. Każdy element zawiera capabilities
obiekt, który może zawierać softwareDevelopment
i mediaTrained
właściwości.
[
{
"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"
}
]
W tym pierwszym przykładzie klauzula GROUP BY
jest używana do tworzenia grup elementów przy użyciu wartości określonej właściwości.
SELECT
e.capabilities.softwareDevelopment AS developmentLang
FROM
employees e
GROUP BY
e.capabilities.softwareDevelopment
[
{},
{
"developmentLang": "c-sharp"
},
{
"developmentLang": "javascript"
},
{
"developmentLang": "python"
}
]
W następnym przykładzie funkcja systemu agregacji (COUNT
) jest używana z grupowaniami w celu zapewnienia całkowitej liczby elementów na grupę.
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"
}
]
W tym ostatnim przykładzie elementy są grupowane przy użyciu wielu właściwości.
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
}
]
Uwagi
- Gdy zapytanie używa klauzuli
GROUP BY
, klauzulaSELECT
może zawierać tylko podzbiór właściwości i funkcji systemowych zawartych w klauzuliGROUP BY
. Jednym z wyjątków są funkcje agregujące, które mogą występować w klauzuliSELECT
bez uwzględniania w klauzuliGROUP BY
. Zawsze można również uwzględnić wartości literału w klauzuliSELECT
. - Klauzula
GROUP BY
musi znajdować się po klauzuliSELECT
,FROM
iWHERE
przed klauzuląOFFSET LIMIT
. Nie można użyćGROUP BY
klauzuliORDER BY
. - Klauzula
GROUP BY
nie zezwala na żadne z następujących funkcji, właściwości ani funkcji:- Aliasowanie właściwości lub aliasów funkcji systemowych (aliasowanie jest nadal dozwolone w klauzuli
SELECT
) - Zapytania podrzędne
- Funkcje systemu agregacji (te funkcje są dozwolone tylko w klauzuli
SELECT
)
- Aliasowanie właściwości lub aliasów funkcji systemowych (aliasowanie jest nadal dozwolone w klauzuli
- Zapytania z funkcją systemową agregacji i podzapytaniem za
GROUP BY
pomocą polecenia nie są obsługiwane. - Zapytania obejmujące wiele partycji
GROUP BY
mogą mieć maksymalnie 21 zagregowanych funkcji systemowych.