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, które są 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 poszczególnych wyrażeń ani kardynalności każdego wyrażenia. |
Przykłady
W przykładach w tej sekcji jest używany ten zestaw referencyjny elementów. Każdy element zawiera capabilities
obiekt, który może zawierać softwareDevelopment
właściwości i 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"
}
]
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": "python"
},
{
"developmentLang": "javascript"
},
{
"developmentLang": "c-sharp"
},
{}
]
W następnym przykładzie funkcja systemowa agregacji (COUNT
) jest używana z grupami 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": 2,
"developmentLang": "python"
},
{
"trainedEmployees": 3,
"developmentLang": "javascript"
},
{
"trainedEmployees": 1,
"developmentLang": "c-sharp"
},
{
"trainedEmployees": 1
}
]
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ą pojawiać się 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 aliasowania funkcji systemowych (aliasowanie jest nadal dozwolone w klauzuli
SELECT
) - Zapytania podrzędne
- Funkcje systemowe agregujące (te funkcje są dozwolone tylko w klauzuli
SELECT
)
- Aliasowanie właściwości lub aliasowania funkcji systemowych (aliasowanie jest nadal dozwolone w klauzuli
- Zapytania z agregowaną funkcją systemową i podzapytaniem z funkcją
GROUP BY
nie są obsługiwane. - Zapytania obejmujące wiele partycji
GROUP BY
mogą mieć maksymalnie 21 agregujących funkcji systemowych.