aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Blinkov <ivan@ydb.tech>2025-06-04 20:13:15 +0700
committerGitHub <noreply@github.com>2025-06-04 13:13:15 +0000
commitc83d7c2ed828d1e077d4a5d1b2af5c2480aa89fc (patch)
tree8545afb914d3af4af7f560f90917f143a77b7223
parentc08cde4adb45ab4232fc993fe2f2e06487f25326 (diff)
downloadydb-c83d7c2ed828d1e077d4a5d1b2af5c2480aa89fc.tar.gz
YDBDOCS-1114: move remaining SELECT clauses to its folder (#18283)
Co-authored-by: ElenaAfina <144937430+ElenaAfina@users.noreply.github.com>
-rw-r--r--ydb/docs/en/core/concepts/optimizer.md4
-rw-r--r--ydb/docs/en/core/dev/yql-tutorial/join_tables.md2
-rw-r--r--ydb/docs/en/core/yql/reference/builtins/aggregation.md17
-rw-r--r--ydb/docs/en/core/yql/reference/builtins/basic.md3
-rw-r--r--ydb/docs/en/core/yql/reference/builtins/window.md20
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/expressions.md2
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/index.md13
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/pragma.md8
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/select/_assets/join-YQL-06.png (renamed from ydb/docs/en/core/yql/reference/syntax/_assets/join-YQL-06.png)bin24792 -> 24792 bytes
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/select/distinct.md6
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/select/flatten.md (renamed from ydb/docs/en/core/yql/reference/syntax/flatten.md)10
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/select/group-by.md (renamed from ydb/docs/en/core/yql/reference/syntax/group_by.md)20
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/select/index.md18
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/select/join.md (renamed from ydb/docs/en/core/yql/reference/syntax/join.md)0
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/select/order_by.md2
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/select/secondary_index.md2
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/select/toc_i.yaml4
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/select/window.md (renamed from ydb/docs/en/core/yql/reference/syntax/window.md)6
-rw-r--r--ydb/docs/en/core/yql/reference/syntax/toc_i.yaml4
-rw-r--r--ydb/docs/redirects.yaml8
-rw-r--r--ydb/docs/ru/core/concepts/optimizer.md4
-rwxr-xr-xydb/docs/ru/core/dev/yql-tutorial/join_tables.md2
-rw-r--r--ydb/docs/ru/core/yql/reference/builtins/aggregation.md21
-rw-r--r--ydb/docs/ru/core/yql/reference/builtins/basic.md21
-rw-r--r--ydb/docs/ru/core/yql/reference/builtins/window.md22
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/expressions.md2
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/index.md15
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/join.md5
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/pragma.md8
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/select/_assets/join-YQL-06.png (renamed from ydb/docs/ru/core/yql/reference/syntax/_assets/join-YQL-06.png)bin24792 -> 24792 bytes
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/select/distinct.md4
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/select/flatten.md (renamed from ydb/docs/ru/core/yql/reference/syntax/flatten.md)8
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/select/group-by.md (renamed from ydb/docs/ru/core/yql/reference/syntax/group_by.md)22
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/select/index.md26
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/select/join.md149
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/select/order_by.md2
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/select/secondary_index.md2
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/select/toc_i.yaml4
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/select/window.md (renamed from ydb/docs/ru/core/yql/reference/syntax/window.md)10
-rw-r--r--ydb/docs/ru/core/yql/reference/syntax/toc_i.yaml4
40 files changed, 308 insertions, 172 deletions
diff --git a/ydb/docs/en/core/concepts/optimizer.md b/ydb/docs/en/core/concepts/optimizer.md
index 0b6eed167bb..a8244bbcad4 100644
--- a/ydb/docs/en/core/concepts/optimizer.md
+++ b/ydb/docs/en/core/concepts/optimizer.md
@@ -2,7 +2,7 @@
{{ ydb-short-name }} uses two types of query optimizers: a rule-based optimizer and a cost-based optimizer. The cost-based optimizer is used for complex queries, typically analytical ([OLAP](https://en.wikipedia.org/wiki/Online_analytical_processing)), while rule-based optimization works on all queries.
-A query plan is a graph of operations, such as reading data from a source, filtering a data stream by a predicate, or performing more complex operations such as [JOIN](../yql/reference/syntax/join.md) and [GROUP BY](../yql/reference/syntax/group_by.md). Optimizers in {{ ydb-short-name }} take an initial query plan as input and transform it into a more efficient plan that is equivalent to the initial one in terms of the returned result.
+A query plan is a graph of operations, such as reading data from a source, filtering a data stream by a predicate, or performing more complex operations such as [JOIN](../yql/reference/syntax/select/join.md) and [GROUP BY](../yql/reference/syntax/select/group-by.md). Optimizers in {{ ydb-short-name }} take an initial query plan as input and transform it into a more efficient plan that is equivalent to the initial one in terms of the returned result.
## Rule-Based Optimizer
@@ -10,7 +10,7 @@ A significant part of the optimizations in {{ ydb-short-name }} applies to almos
## Cost-Based Query Optimizer
-The cost-based optimizer is used for more complex optimizations, such as choosing an optimal join order and join algorithms. The cost-based optimizer considers a large number of alternative execution plans for each query and selects the best one based on the cost estimate for each option. Currently, this optimizer only works with plans that contain [JOIN](../yql/reference/syntax/join.md) operations. It chooses the best order for these operations and the most efficient algorithm implementation for each join operation in the plan.
+The cost-based optimizer is used for more complex optimizations, such as choosing an optimal join order and join algorithms. The cost-based optimizer considers a large number of alternative execution plans for each query and selects the best one based on the cost estimate for each option. Currently, this optimizer only works with plans that contain [JOIN](../yql/reference/syntax/select/join.md) operations. It chooses the best order for these operations and the most efficient algorithm implementation for each join operation in the plan.
The cost-optimizer consists of three main components:
diff --git a/ydb/docs/en/core/dev/yql-tutorial/join_tables.md b/ydb/docs/en/core/dev/yql-tutorial/join_tables.md
index 54ca833e845..a513bff6ded 100644
--- a/ydb/docs/en/core/dev/yql-tutorial/join_tables.md
+++ b/ydb/docs/en/core/dev/yql-tutorial/join_tables.md
@@ -1,6 +1,6 @@
# Joining tables with JOIN
-Merge the columns of the source tables `seasons` and `series`, then output all the seasons of the IT Crowd series to the resulting table using the [JOIN](../../yql/reference/syntax/join.md) operator.
+Merge the columns of the source tables `seasons` and `series`, then output all the seasons of the IT Crowd series to the resulting table using the [JOIN](../../yql/reference/syntax/select/join.md) operator.
{% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %}
diff --git a/ydb/docs/en/core/yql/reference/builtins/aggregation.md b/ydb/docs/en/core/yql/reference/builtins/aggregation.md
index 3f7c8c3ad0f..5be4194569a 100644
--- a/ydb/docs/en/core/yql/reference/builtins/aggregation.md
+++ b/ydb/docs/en/core/yql/reference/builtins/aggregation.md
@@ -4,7 +4,7 @@
Counting the number of rows in the table (if `*` or constant is specified as the argument) or non-empty values in a table column (if the column name is specified as an argument).
-Like other aggregate functions, it can be combined with [GROUP BY](../syntax/group_by.md) to get statistics on the parts of the table that correspond to the values in the columns being grouped. {% if select_statement != "SELECT STREAM" %}Use the modifier [DISTINCT](../syntax/group_by.md#distinct) to count distinct values.{% endif %}
+Like other aggregate functions, it can be combined with [GROUP BY](../syntax/select/group-by.md) to get statistics on the parts of the table that correspond to the values in the columns being grouped. {% if select_statement != "SELECT STREAM" %}Use the modifier [DISTINCT](../syntax/select/group-by.md#distinct) to count distinct values.{% endif %}
### Examples
@@ -75,13 +75,20 @@ The function *does not* do the implicit type casting to Boolean for strings and
```yql
SELECT
COUNT_IF(value % 2 == 1) AS odd_count
+FROM my_table;
```
{% if select_statement != "SELECT STREAM" %}
{% note info %}
-To count distinct values in rows meeting the condition, unlike other aggregate functions, you can't use the modifier [DISTINCT](../syntax/group_by.md#distinct) because arguments contain no values. To get this result, use in the subquery the built-in function [IF](basic.md#if) with two arguments (to get `NULL` in else), and apply an outer [COUNT(DISTINCT ...)](#count) to its result.
+To count distinct values in rows meeting the condition, unlike other aggregate functions, you can't use the modifier [DISTINCT](../syntax/select/group-by.md#distinct) because arguments contain no values. To get such a result, use a query like this:
+
+```yql
+SELECT
+ COUNT(DISTINCT IF(value % 2 == 1, value))
+FROM my_table;
+```
{% endnote %}
@@ -175,7 +182,7 @@ The order of elements in the result list depends on the implementation and can't
To return a list of multiple values from one line, **DO NOT** use the `AGGREGATE_LIST` function several times, but add all the needed values to a container, for example, via [AsList](basic.md#aslist) or [AsTuple](basic.md#astuple), then pass this container to a single `AGGREGATE_LIST` call.
-For example, you can combine it with `DISTINCT` and the function [String::JoinFromList](../udf/list/string.md) (it's an equivalent of `','.join(list)` in Python) to output to a string all the values found in the column after [GROUP BY](../syntax/group_by.md).
+For example, you can combine it with `DISTINCT` and the function [String::JoinFromList](../udf/list/string.md) (it's an equivalent of `','.join(list)` in Python) to output to a string all the values found in the column after [GROUP BY](../syntax/select/group-by.md).
### Examples
@@ -462,7 +469,7 @@ Difference between Adaptive and Block:
### If you need an accurate histogram
1. You can use the aggregate functions described below with fixed bucket grids: [LinearHistogram](#linearhistogram) or [LogarithmicHistogram](#linearhistogram).
-2. You can calculate the bucket number for each row and apply to it [GROUP BY](../syntax/group_by.md).
+2. You can calculate the bucket number for each row and apply to it [GROUP BY](../syntax/select/group-by.md).
When you use [aggregation factories](basic.md#aggregationfactory), a `Tuple` containing a value and a weight is passed as the first [AGGREGATE_BY](#aggregate-by) argument.
@@ -594,7 +601,7 @@ FROM my_table;
## SessionStart {#session-start}
-No arguments. It's allowed only if there is [SessionWindow](../syntax/group_by.md#session-window) in [GROUP BY](../syntax/group_by.md) / [PARTITION BY](../syntax/window.md#partition).
+No arguments. It's allowed only if there is [SessionWindow](../syntax/select/group-by.md#session-window) in [GROUP BY](../syntax/select/group-by.md) / [PARTITION BY](../syntax/select/window.md#partition).
Returns the value of the `SessionWindow` key column. If `SessionWindow` has two arguments, it returns the minimum value of the first argument within the group/section.
In the case of the expanded version `SessionWindow`, it returns the value of the second element from the tuple returned by `<calculate_lambda>`, for which the first tuple element is `True`.
diff --git a/ydb/docs/en/core/yql/reference/builtins/basic.md b/ydb/docs/en/core/yql/reference/builtins/basic.md
index 1cf683490fe..08259043402 100644
--- a/ydb/docs/en/core/yql/reference/builtins/basic.md
+++ b/ydb/docs/en/core/yql/reference/builtins/basic.md
@@ -1,4 +1,3 @@
-
# Basic built-in functions
Below are the general-purpose functions. For specialized functions, there are separate articles: [aggregate functions](aggregation.md){% if feature_window_functions %}, [window functions](window.md){% endif %}, and functions for [lists](list.md), [dictionaries](dict.md), [structures](struct.md), [data types](types.md){% if feature_codegen %}, and [code generation](codegen.md){% endif %}.
@@ -1303,7 +1302,7 @@ SELECT ListAggregate([1,2,3], $g); -- 12
## AggregateFlatten {#aggregateflatten}
-Adapts a factory for [aggregation functions](aggregation.md), for example, obtained using the [AggregationFactory](#aggregationfactory) function in a way that allows aggregation of list input items. This operation is similar to [FLATTEN LIST BY](../syntax/flatten.md): Each list item is aggregated.
+Adapts a factory for [aggregation functions](aggregation.md), for example, obtained using the [AggregationFactory](#aggregationfactory) function in a way that allows aggregation of list input items. This operation is similar to [FLATTEN LIST BY](../syntax/select/flatten.md): Each list item is aggregated.
Arguments:
diff --git a/ydb/docs/en/core/yql/reference/builtins/window.md b/ydb/docs/en/core/yql/reference/builtins/window.md
index f9a670167be..2725efa0064 100644
--- a/ydb/docs/en/core/yql/reference/builtins/window.md
+++ b/ydb/docs/en/core/yql/reference/builtins/window.md
@@ -1,14 +1,14 @@
# List of window functions in YQL
-The syntax for calling window functions is detailed in a [separate article](../syntax/window.md).
+The syntax for calling window functions is detailed in a [separate article](../syntax/select/window.md).
## Aggregate functions {#aggregate-functions}
All [aggregate functions](aggregation.md) can also be used as window functions.
-In this case, each row includes an aggregation result obtained on a set of rows from the [window frame](../syntax/window.md#frame).
+In this case, each row includes an aggregation result obtained on a set of rows from the [window frame](../syntax/select/window.md#frame).
### Examples
@@ -26,7 +26,7 @@ WINDOW
## ROW_NUMBER {#row_number}
-Row number within a [partition](../syntax/window.md#partition). No arguments.
+Row number within a [partition](../syntax/select/window.md#partition). No arguments.
### Signature
@@ -47,7 +47,7 @@ WINDOW w AS (ORDER BY key);
## LAG / LEAD {#lag-lead}
-Accessing a value from a row in the [section](../syntax/window.md#partition) that lags behind (`LAG`) or leads (`LEAD`) the current row by a fixed number. The first argument specifies the expression to be accessed, and the second argument specifies the offset in rows. You may omit the offset. By default, the neighbor row is used: the previous or next, respectively (hence, 1 is assumed by default). For the rows having no neighbors at a given distance (for example, `LAG(expr, 3)` `NULL` is returned in the first and second rows of the section).
+Accessing a value from a row in the [section](../syntax/select/window.md#partition) that lags behind (`LAG`) or leads (`LEAD`) the current row by a fixed number. The first argument specifies the expression to be accessed, and the second argument specifies the offset in rows. You may omit the offset. By default, the neighbor row is used: the previous or next, respectively (hence, 1 is assumed by default). For the rows having no neighbors at a given distance (for example, `LAG(expr, 3)` `NULL` is returned in the first and second rows of the section).
### Signature
@@ -93,7 +93,7 @@ item odd lag1
## FIRST_VALUE / LAST_VALUE
-Access values from the first and last rows (using the `ORDER BY` clause for the window) of the [window frame](../syntax/window.md#frame). The only argument is the expression that you need to access.
+Access values from the first and last rows (using the `ORDER BY` clause for the window) of the [window frame](../syntax/select/window.md#frame). The only argument is the expression that you need to access.
Optionally, `OVER` can be preceded by the additional modifier `IGNORE NULLS`. It changes the behavior of functions to the first or last **non-empty** (i.e., non-`NULL`) value among the window frame rows. The antonym of this modifier is `RESPECT NULLS`: it's the default behavior that can be omitted.
@@ -124,7 +124,7 @@ WINDOW w AS (ORDER BY key);
## NTH_VALUE
-Access a value from a row specified by position in the window's `ORDER BY` order within [window frame](../syntax/window.md#frame). Arguments - the expression to access and the row number, starting with 1.
+Access a value from a row specified by position in the window's `ORDER BY` order within [window frame](../syntax/select/window.md#frame). Arguments - the expression to access and the row number, starting with 1.
Optionally, the `IGNORE NULLS` modifier can be specified before `OVER`, which causes rows with `NULL` in the first argument's value to be skipped. The antonym of this modifier is `RESPECT NULLS`, which is the default behavior and may be skipped.
@@ -155,7 +155,7 @@ WINDOW w AS (ORDER BY key);
## RANK / DENSE_RANK / PERCENT_RANK {#rank}
-Number the groups of neighboring rows in the [partition](../syntax/window.md#partition) with the same expression value in the argument. `DENSE_RANK` numbers the groups one by one, and `RANK` skips `(N - 1)` values, with `N` being the number of rows in the previous group. `PERCENT_RANK` returns the relative rank of the current row: $(RANK - 1)/(number of rows in the partition - 1)$.
+Number the groups of neighboring rows in the [partition](../syntax/select/window.md#partition) with the same expression value in the argument. `DENSE_RANK` numbers the groups one by one, and `RANK` skips `(N - 1)` values, with `N` being the number of rows in the previous group. `PERCENT_RANK` returns the relative rank of the current row: $(RANK - 1)/(number of rows in the partition - 1)$.
If there is no argument, it uses the order specified in the `ORDER BY` section in the window definition.
If the argument is omitted and `ORDER BY` is not specified, then all rows are considered equal to each other.
@@ -201,7 +201,7 @@ WINDOW w AS (ORDER BY my_column);
## NTILE
-Distributes the rows of an ordered [partition](../syntax/window.md#partition) into a specified number of groups. The groups are numbered starting with one. For each row, the `NTILE` function returns the number of the group to which the row belongs.
+Distributes the rows of an ordered [partition](../syntax/select/window.md#partition) into a specified number of groups. The groups are numbered starting with one. For each row, the `NTILE` function returns the number of the group to which the row belongs.
### Signature
@@ -222,7 +222,7 @@ WINDOW w AS (ORDER BY key);
## CUME_DIST
-Returns the relative position (> 0 and <= 1) of a row within a [partition](../syntax/window.md#partition). No arguments.
+Returns the relative position (> 0 and <= 1) of a row within a [partition](../syntax/select/window.md#partition). No arguments.
### Signature
@@ -242,6 +242,6 @@ WINDOW w AS (ORDER BY key);
## SessionState() {#session-state}
-A non-standard window function `SessionState()` (without arguments) lets you get the session calculation status from [SessionWindow](../syntax/group_by.md#session-window) for the current row.
+A non-standard window function `SessionState()` (without arguments) lets you get the session calculation status from [SessionWindow](../syntax/select/group-by.md#session-window) for the current row.
It's allowed only if `SessionWindow()` is present in the `PARTITION BY` section in the window definition.
diff --git a/ydb/docs/en/core/yql/reference/syntax/expressions.md b/ydb/docs/en/core/yql/reference/syntax/expressions.md
index d775b15fb53..14ff4efb95b 100644
--- a/ydb/docs/en/core/yql/reference/syntax/expressions.md
+++ b/ydb/docs/en/core/yql/reference/syntax/expressions.md
@@ -465,7 +465,7 @@ A table expression is an expression that returns a table. Table expressions in Y
Semantics of a table expression depends on the context where it is used. In YQL, table expressions can be used in the following contexts:
-* Table context: after [FROM](select/from.md). In this case, table expressions work as expected: for example, `$input = SELECT a, b, c FROM T; SELECT * FROM $input` returns a table with three columns. The table context also occurs after [UNION ALL](select/union.md#unionall){% if feature_join %}, [JOIN](join.md#join){% endif %}{% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](process.md#process), [REDUCE](reduce.md#reduce){% endif %};
+* Table context: after [FROM](select/from.md). In this case, table expressions work as expected: for example, `$input = SELECT a, b, c FROM T; SELECT * FROM $input` returns a table with three columns. The table context also occurs after [UNION ALL](select/index.md#unionall){% if feature_join %}, [JOIN](select/join.md#join){% endif %}{% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](process.md#process), [REDUCE](reduce.md#reduce){% endif %};
* Vector context: after [IN](#in). In this context, the table expression must contain exactly one column (the name of this column doesn't affect the expression result in any way). A table expression in a vector context is typed as a list (the type of the list element is the same as the column type in this case). Example: `SELECT * FROM T WHERE key IN (SELECT k FROM T1)`;
* A scalar context arises *in all the other cases*. As in a vector context, a table expression must contain exactly one column, but the value of the table expression is a scalar, that is, an arbitrarily selected value of this column (if no rows are returned, the result is `NULL`). Example: `$count = SELECT COUNT(*) FROM T; SELECT * FROM T ORDER BY key LIMIT $count / 2`;
diff --git a/ydb/docs/en/core/yql/reference/syntax/index.md b/ydb/docs/en/core/yql/reference/syntax/index.md
index 289dc93d94a..31fa023ef96 100644
--- a/ydb/docs/en/core/yql/reference/syntax/index.md
+++ b/ydb/docs/en/core/yql/reference/syntax/index.md
@@ -42,19 +42,6 @@
{% endif %}
-* [GROUP BY](group_by.md)
-{% if feature_join %}
-* [JOIN](join.md)
-
-{% endif %}
-
-{% if feature_window_functions %}
-
-* [WINDOW](window.md)
-
-{% endif %}
-
-* [FLATTEN](flatten.md)
* [ACTION](action.md)
{% if feature_mapreduce and process_command == "PROCESS" %}
diff --git a/ydb/docs/en/core/yql/reference/syntax/pragma.md b/ydb/docs/en/core/yql/reference/syntax/pragma.md
index e56e659dcb8..91c12deb2af 100644
--- a/ydb/docs/en/core/yql/reference/syntax/pragma.md
+++ b/ydb/docs/en/core/yql/reference/syntax/pragma.md
@@ -119,7 +119,7 @@ When set to "auto", it enables a new compute engine. Computing is made, whenever
When you use `SELECT foo.* FROM ... AS foo`, remove the `foo.` prefix from the names of the result columns.
-It can be also used with a [JOIN](join.md), but in this case it may fail in the case of a name conflict (that can be resolved by using [WITHOUT](select/without.md) and renaming columns). For JOIN in SimpleColumns mode, an implicit Coalesce is made for key columns: the query `SELECT * FROM T1 AS a JOIN T2 AS b USING(key)` in the SimpleColumns mode works same as `SELECT a.key ?? b.key AS key, ... FROM T1 AS a JOIN T2 AS b USING(key)`.
+It can be also used with a [JOIN](select/join.md), but in this case it may fail in the case of a name conflict (that can be resolved by using [WITHOUT](select/without.md) and renaming columns). For JOIN in SimpleColumns mode, an implicit Coalesce is applied to the key columns.
### CoalesceJoinKeysOnQualifiedAll
@@ -139,7 +139,7 @@ Controls implicit Coalesce for the key `JOIN` columns in the SimpleColumns mode.
| --- | --- |
| Flag | false |
-If the flag is set, then [JOIN](join.md) will require strict matching of key types.
+If the flag is set, then [JOIN](select/join.md) will require strict matching of key types.
By default, JOIN preconverts keys to a shared type, which might result in performance degradation.
StrictJoinKeyTypes is a [scoped](pragma.md#pragmascope) setting.
@@ -272,7 +272,7 @@ Generate a warning if a column name was automatically generated for an unnamed e
| --- | --- |
| Positive number | 32 |
-Increasing the limit on the number of dimensions in [GROUP BY](group_by.md).
+Increasing the limit on the number of dimensions in [GROUP BY](select/group-by.md).
{% if feature_group_by_rollup_cube %}
@@ -282,7 +282,7 @@ Increasing the limit on the number of dimensions in [GROUP BY](group_by.md).
| --- | --- |
| Positive number | 5 |
-Increasing the limit on the number of dimensions in [GROUP BY](group_by.md#rollup-cube-group-sets).
+Increasing the limit on the number of dimensions in [GROUP BY](select/group-by.md#rollup-cube-group-sets).
Use this option with care, because the computational complexity of the query grows exponentially with the number of dimensions.
diff --git a/ydb/docs/en/core/yql/reference/syntax/_assets/join-YQL-06.png b/ydb/docs/en/core/yql/reference/syntax/select/_assets/join-YQL-06.png
index aae84322b7c..aae84322b7c 100644
--- a/ydb/docs/en/core/yql/reference/syntax/_assets/join-YQL-06.png
+++ b/ydb/docs/en/core/yql/reference/syntax/select/_assets/join-YQL-06.png
Binary files differ
diff --git a/ydb/docs/en/core/yql/reference/syntax/select/distinct.md b/ydb/docs/en/core/yql/reference/syntax/select/distinct.md
index ae3eec36856..e7bb2736846 100644
--- a/ydb/docs/en/core/yql/reference/syntax/select/distinct.md
+++ b/ydb/docs/en/core/yql/reference/syntax/select/distinct.md
@@ -4,7 +4,7 @@ Selecting unique rows.
{% note info %}
-Applying `DISTINCT` to calculated values is not currently implemented. For this purpose, use a subquery or the clause [`GROUP BY ... AS ...`](../group_by.md).
+Applying `DISTINCT` to calculated values is not currently implemented. For this purpose, use a subquery or the clause [`GROUP BY ... AS ...`](group-by.md).
{% endnote %}
@@ -15,5 +15,7 @@ SELECT DISTINCT value -- only unique values from the table
FROM my_table;
```
-The `DISTINCT` keyword can also be used to apply [aggregate functions](../../builtins/aggregation.md) only to distinct values. For more information, see the documentation for [GROUP BY](../group_by.md).
+The `DISTINCT` keyword can also be used to apply [aggregate functions](../../builtins/aggregation.md) only to distinct values. For more information, see the documentation for [GROUP BY](group-by.md).
+
+Removes duplicate rows from the result. Applies after the clause [`GROUP BY ... AS ...`](group-by.md).
diff --git a/ydb/docs/en/core/yql/reference/syntax/flatten.md b/ydb/docs/en/core/yql/reference/syntax/select/flatten.md
index 3f7924f0d97..b1472307aa2 100644
--- a/ydb/docs/en/core/yql/reference/syntax/flatten.md
+++ b/ydb/docs/en/core/yql/reference/syntax/select/flatten.md
@@ -2,7 +2,7 @@
## FLATTEN BY {#flatten-by}
-Converts rows in the source table using vertical unpacking of [containers](../types/containers.md) of variable length (lists or dictionaries).
+Converts rows in the source table using vertical unpacking of [containers](../../types/containers.md) of variable length (lists or dictionaries).
For example:
@@ -41,14 +41,10 @@ SELECT value, id FROM as_table($sample) FLATTEN BY (value);
This conversion can be convenient in the following cases:
-* When it is necessary to output statistics by cells from a container column (for example, via [`GROUP BY`](group_by.md)).
-
-{% if feature_join %}
+* When it is necessary to output statistics by cells from a container column (for example, via [`GROUP BY`](group-by.md)).
* When the cells in a container column store IDs from another table that you want to join with [`JOIN`](join.md).
-{% endif %}
-
### Syntax
* `FLATTEN BY` is specified after `FROM`, but before `GROUP BY`, if `GROUP BY` is present in the query.
@@ -68,7 +64,7 @@ This conversion can be convenient in the following cases:
{% note info %}
-`FLATTEN BY` interprets [optional data types](../types/optional.md) as lists of length 0 or 1. The table rows with `NULL` are skipped, and the column type changes to a similar non-optional type.
+`FLATTEN BY` interprets [optional data types](../../types/optional.md) as lists of length 0 or 1. The table rows with `NULL` are skipped, and the column type changes to a similar non-optional type.
`FLATTEN BY` makes only one conversion at a time, so use `FLATTEN LIST BY` or `FLATTEN OPTIONAL BY` on optional containers, for example, `Optional<List<String>>`.
diff --git a/ydb/docs/en/core/yql/reference/syntax/group_by.md b/ydb/docs/en/core/yql/reference/syntax/select/group-by.md
index cfd46ee1860..d99ec153b70 100644
--- a/ydb/docs/en/core/yql/reference/syntax/group_by.md
+++ b/ydb/docs/en/core/yql/reference/syntax/select/group-by.md
@@ -2,7 +2,7 @@
## GROUP BY
-Group the `SELECT` results by the values of the specified columns or expressions. `GROUP BY` is often combined with [aggregate functions](../builtins/aggregation.md) (`COUNT`, `MAX`, `MIN`, `SUM`, `AVG`) to perform calculations in each group.
+Group the `SELECT` results by the values of the specified columns or expressions. `GROUP BY` is often combined with [aggregate functions](../../builtins/aggregation.md) (`COUNT`, `MAX`, `MIN`, `SUM`, `AVG`) to perform calculations in each group.
If `GROUP BY` is present in the query, then when selecting columns (between `SELECT ... FROM`), you can use the following constructs:
@@ -40,7 +40,7 @@ Aggregate functions ignore `NULL` in their arguments, except for `COUNT`.
{% endnote %}
-YQL also provides aggregation factories implemented by the functions [`AGGREGATION_FACTORY`](../builtins/basic.md#aggregationfactory) and [`AGGREGATE_BY`](../builtins/aggregation.md#aggregateby).
+YQL also provides aggregation factories implemented by the functions [`AGGREGATION_FACTORY`](../../builtins/basic.md#aggregationfactory) and [`AGGREGATE_BY`](../../builtins/aggregation.md#aggregateby).
### Examples {#examples}
@@ -71,7 +71,7 @@ GROUP BY
{% note warning %}
-Specifying a name for a column or expression in `GROUP BY .. AS foo` it is an extension on top of YQL. Such a name becomes visible in `WHERE` despite the fact that filtering by `WHERE` is executed [before](select/where.md) the grouping. For example, if the `T` table includes two columns, `foo` and `bar`, then the query `SELECT foo FROM T WHERE foo > 0 GROUP BY bar AS foo` would actually filter data by the `bar` column from the source table.
+Specifying a name for a column or expression in `GROUP BY .. AS foo` it is an extension on top of YQL. Such a name becomes visible in `WHERE` despite the fact that filtering by `WHERE` is executed [before](../index.md#selectexec) the grouping. For example, if the `T` table includes two columns, `foo` and `bar`, then the query `SELECT foo FROM T WHERE foo > 0 GROUP BY bar AS foo` would actually filter data by the `bar` column from the source table.
{% endnote %}
@@ -107,7 +107,7 @@ The following happens in this case:
The `SessionWindow()` key column (in the example, it's `session_start`) has the value "the minimum `time_expr` in the session".
If `GROUP BY` includes SessionWindow(), you can use a special aggregate function
-[SessionStart](../builtins/aggregation.md#session-start).
+[SessionStart](../../builtins/aggregation.md#session-start).
An extended version of SessionWindow with four arguments is also supported:
@@ -229,11 +229,11 @@ GROUP BY
## DISTINCT {#distinct}
-Applying [aggregate functions](../builtins/aggregation.md) only to distinct values of the column.
+Applying [aggregate functions](../../builtins/aggregation.md) only to distinct values of the column.
{% note info %}
-Applying `DISTINCT` to calculated values is not currently implemented. For this purpose, you can use a [subquery](select/from.md) or the expression `GROUP BY ... AS ...`.
+Applying `DISTINCT` to calculated values is not currently implemented. For this purpose, you can use a [subquery](from.md) or the expression `GROUP BY ... AS ...`.
{% endnote %}
@@ -249,7 +249,7 @@ ORDER BY count DESC
LIMIT 3;
```
-You can also use `DISTINCT` to fetch distinct rows using [`SELECT DISTINCT`](select/distinct.md).
+You can also use `DISTINCT` to fetch distinct rows using [`SELECT DISTINCT`](distinct.md).
@@ -257,7 +257,7 @@ You can also use `DISTINCT` to fetch distinct rows using [`SELECT DISTINCT`](sel
Improves aggregation efficiency if the query author knows in advance that none of aggregation keys finds large amounts of data (i.e., with the order of magnitude exceeding a gigabyte or a million of rows). If this assumption fails to materialize, then the operation may fail with Out of Memory error or start running much slower compared to the non-COMPACT version.
-Unlike the usual GROUP BY, the Map-side combiner stage and additional Reduce are disabled for each field with [DISTINCT](../syntax/group_by.md#distinct) aggregation.
+Unlike the usual GROUP BY, the Map-side combiner stage and additional Reduce are disabled for each field with [DISTINCT](#distinct) aggregation.
### Example
@@ -306,7 +306,7 @@ The `interval` and `hop` parameters must be positive.
The `delay` parameter is ignored in the current implementation because the data in one partition is already sorted.
{% endif %}
-To set `hop`, `interval`, and `delay`, use a string expression compliant with [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601). This format is used to construct the built-in `Interval` type [from a string](../builtins/basic.md#data-type-literals).
+To set `hop`, `interval`, and `delay`, use a string expression compliant with [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601). This format is used to construct the built-in `Interval` type [from a string](../../builtins/basic.md#data-type-literals).
When selecting columns (between `SELECT ... FROM`) you can use the `HOP_START` and `HOP_END` functions (without parameters), which return a value of `Timestamp` type, corresponding to the start and end of the current window.
@@ -340,7 +340,7 @@ GROUP BY
## HAVING {#having}
-Filtering a `SELECT` based on the calculation results of [aggregate functions](../builtins/aggregation.md). The syntax is similar to [WHERE](select/where.md).
+Filtering a `SELECT` based on the calculation results of [aggregate functions](../../builtins/aggregation.md). The syntax is similar to [WHERE](where.md).
### Example
diff --git a/ydb/docs/en/core/yql/reference/syntax/select/index.md b/ydb/docs/en/core/yql/reference/syntax/select/index.md
index bc219d210b1..ef4603cbb52 100644
--- a/ydb/docs/en/core/yql/reference/syntax/select/index.md
+++ b/ydb/docs/en/core/yql/reference/syntax/select/index.md
@@ -25,22 +25,22 @@ The `SELECT` query result is calculated as follows:
* Determine the set of input tables by evaluating the [FROM](from.md) clauses.
* Apply [MATCH_RECOGNIZE](match_recognize.md) to input tables.
* Evaluate [SAMPLE](sample.md)/[TABLESAMPLE](sample.md).
-* Execute [FLATTEN COLUMNS](../flatten.md#flatten-columns) or [FLATTEN BY](../flatten.md); aliases set in `FLATTEN BY` become visible after this point.
+* Execute [FLATTEN COLUMNS](flatten.md#flatten-columns) or [FLATTEN BY](flatten.md); aliases set in `FLATTEN BY` become visible after this point.
{% if feature_join %}
-* Execute every [JOIN](../join.md).
+* Execute every [JOIN](join.md).
{% endif %}
-* Add to (or replace in) the data the columns listed in [GROUP BY ... AS ...](../group_by.md).
+* Add to (or replace in) the data the columns listed in [GROUP BY ... AS ...](group-by.md).
* Execute [WHERE](where.md) &mdash; Discard all the data mismatching the predicate.
-* Execute [GROUP BY](../group_by.md), evaluate aggregate functions.
-* Apply the filter [HAVING](../group_by.md#having).
+* Execute [GROUP BY](group-by.md), evaluate aggregate functions.
+* Apply the filter [HAVING](group-by.md#having).
{% if feature_window_functions %}
-* Evaluate [window functions](../window.md);
+* Evaluate [window functions](window.md);
{% endif %}
@@ -70,7 +70,7 @@ If you enable `PRAGMA OrderedColumns;`, the order of columns is preserved in the
{% if feature_join %}
-* The order of columns after [JOIN](../join.md): First output the left-hand columns, then the right-hand ones. If the column order in any of the sides in the `JOIN` output is undefined, the column order in the result is also undefined.
+* The order of columns after [JOIN](join.md): First output the left-hand columns, then the right-hand ones. If the column order in any of the sides in the `JOIN` output is undefined, the column order in the result is also undefined.
{% endif %}
@@ -119,6 +119,10 @@ If the underlying queries have one of the `ORDER BY/LIMIT/DISCARD/INTO RESULT` o
* [FROM](from.md)
* [FROM AS_TABLE](from_as_table.md)
* [FROM SELECT](from_select.md)
+* [JOIN](join.md)
+* [GROUP BY](group-by.md)
+* [FLATTEN](flatten.md)
+* [WINDOW](window.md)
* [DISTINCT](distinct.md)
* [UNIQUE DISTINCT](unique_distinct_hints.md)
* [UNION](union.md)
diff --git a/ydb/docs/en/core/yql/reference/syntax/join.md b/ydb/docs/en/core/yql/reference/syntax/select/join.md
index 65f18ebf6ac..65f18ebf6ac 100644
--- a/ydb/docs/en/core/yql/reference/syntax/join.md
+++ b/ydb/docs/en/core/yql/reference/syntax/select/join.md
diff --git a/ydb/docs/en/core/yql/reference/syntax/select/order_by.md b/ydb/docs/en/core/yql/reference/syntax/select/order_by.md
index ac76a35e968..5f8ab52977e 100644
--- a/ydb/docs/en/core/yql/reference/syntax/select/order_by.md
+++ b/ydb/docs/en/core/yql/reference/syntax/select/order_by.md
@@ -19,6 +19,6 @@ ORDER BY key DESC, LENGTH(string_column) ASC;
{% if feature_window_functions %}
-You can also use `ORDER BY` for [window functions](../window.md).
+You can also use `ORDER BY` for [window functions](window.md).
{% endif %}
diff --git a/ydb/docs/en/core/yql/reference/syntax/select/secondary_index.md b/ydb/docs/en/core/yql/reference/syntax/select/secondary_index.md
index 79922d18b44..12f4cf948db 100644
--- a/ydb/docs/en/core/yql/reference/syntax/select/secondary_index.md
+++ b/ydb/docs/en/core/yql/reference/syntax/select/secondary_index.md
@@ -32,7 +32,7 @@ SELECT *
WHERE views >= someValue
```
-* [`JOIN`](../join.md) the `series` and `users` row-oriented tables on the `userName` field using the `users_index` and `name_index` indexes, respectively:
+* [`JOIN`](join.md) the `series` and `users` row-oriented tables on the `userName` field using the `users_index` and `name_index` indexes, respectively:
```yql
SELECT t1.series_id, t1.title
diff --git a/ydb/docs/en/core/yql/reference/syntax/select/toc_i.yaml b/ydb/docs/en/core/yql/reference/syntax/select/toc_i.yaml
index 5ea875a67f1..93ded66ed39 100644
--- a/ydb/docs/en/core/yql/reference/syntax/select/toc_i.yaml
+++ b/ydb/docs/en/core/yql/reference/syntax/select/toc_i.yaml
@@ -5,7 +5,11 @@ items:
- { name: FROM AS_TABLE, href: from_as_table.md }
- { name: FROM SELECT, href: from_select.md }
- { name: FOLDER, href: folder.md, when: yt }
+- { name: FLATTEN, href: flatten.md }
+- { name: GROUP BY, href: group-by.md }
+- { name: JOIN, href: join.md, when: feature_join }
- { name: WalkFolders, href: walk_folders.md, when: yt }
+- { name: WINDOW, href: window.md, when: feature_window_functions }
- { name: DISTINCT, href: distinct.md }
- { name: UNIQUE DISTINCT, href: unique_distinct_hints.md }
- { name: UNION, href: union.md }
diff --git a/ydb/docs/en/core/yql/reference/syntax/window.md b/ydb/docs/en/core/yql/reference/syntax/select/window.md
index 7c7d9e7df8e..32d8cfab994 100644
--- a/ydb/docs/en/core/yql/reference/syntax/window.md
+++ b/ydb/docs/en/core/yql/reference/syntax/select/window.md
@@ -2,7 +2,7 @@
Window functions were introduced in the SQL:2003 standard and expanded in the SQL:2011 standard. They let you run calculations on a set of table rows that are related to the current row in some way.
-Unlike [aggregate functions](../builtins/aggregation.md), window functions don't group rows into one output row: the number of rows in the resulting table is always the same as in the source table.
+Unlike [aggregate functions](../../builtins/aggregation.md), window functions don't group rows into one output row: the number of rows in the resulting table is always the same as in the source table.
If a query contains both aggregate and window functions, grouping is performed and aggregate function values are calculated first. The calculated values of aggregate functions can be used as window function arguments (but not the other way around).
@@ -69,7 +69,7 @@ There should be no window function calls in any of the expressions inside the wi
If `PARTITION BY` is set, the source table rows are grouped into *partitions*, which are then handled independently of each other.
If `PARTITION BY` isn't set, all rows in the source table are put in the same partition. If `ORDER BY` is set, it determines the order of rows in a partition.
-Both in `PARTITION BY` and [GROUP BY](group_by.md) you can use aliases and [SessionWindow](group_by.md#session-window).
+Both in `PARTITION BY` and [GROUP BY](group-by.md) you can use aliases and [SessionWindow](group-by.md#session-window).
If `ORDER BY` is omitted, the order of rows in the partition is undefined.
@@ -88,7 +88,7 @@ Namely, if there is `ORDER BY`, then `ROWS BETWEEN UNBOUNDED PRECEDING AND CURRE
Further, depending on the specific window function, it's calculated either based on the set of rows in the partition or the set of rows in the window frame.
-[List of available window functions](../builtins/window.md)
+[List of available window functions](../../builtins/window.md)
#### Examples
diff --git a/ydb/docs/en/core/yql/reference/syntax/toc_i.yaml b/ydb/docs/en/core/yql/reference/syntax/toc_i.yaml
index 90ee34ab2f0..e66a86581cc 100644
--- a/ydb/docs/en/core/yql/reference/syntax/toc_i.yaml
+++ b/ydb/docs/en/core/yql/reference/syntax/toc_i.yaml
@@ -27,12 +27,9 @@ items:
- { name: DROP VIEW, href: drop-view.md, when: feature_view }
- { name: DROP USER, href: drop-user.md, when: feature_user_and_group }
- { name: GRANT, href: grant.md, when: feature_user_and_group }
-- { name: GROUP BY, href: group_by.md }
- { name: EXPORT and IMPORT, href: export_import.md, when: feature_mapreduce }
-- { name: FLATTEN, href: flatten.md }
- { name: INSERT, href: insert_into.md }
- { name: INTO RESULT, href: into_result.md }
-- { name: JOIN, href: join.md, when: feature_join }
- { name: PRAGMA, href: pragma.md }
- { name: PROCESS STREAM, href: process.md, when: feature_mapreduce and process_command == "PROCESS STREAM" }
- { name: PROCESS, href: process.md, when: feature_mapreduce and process_command == "PROCESS" }
@@ -46,5 +43,4 @@ items:
- { name: UPSERT, href: upsert_into.md, when: feature_upsert }
- { name: USE, href: use.md, when: feature_mapreduce }
- { name: VALUES, href: values.md }
-- { name: WINDOW, href: window.md, when: feature_window_functions }
- { name: Unsupported statements, href: not_yet_supported.md }
diff --git a/ydb/docs/redirects.yaml b/ydb/docs/redirects.yaml
index 14f6bebbd6e..39fcea18070 100644
--- a/ydb/docs/redirects.yaml
+++ b/ydb/docs/redirects.yaml
@@ -177,6 +177,14 @@ common:
to: /yql/reference/syntax/alter-topic.md
- from: /yql/reference/syntax/create_topic.md
to: /yql/reference/syntax/create-topic.md
+ - from: /yql/reference/syntax/flatten.md
+ to: /yql/reference/syntax/select/flatten.md
+ - from: /yql/reference/syntax/group_by.md
+ to: /yql/reference/syntax/select/group-by.md
+ - from: /yql/reference/syntax/join.md
+ to: /yql/reference/syntax/select/join.md
+ - from: /yql/reference/syntax/window.md
+ to: /yql/reference/syntax/select/window.md
- from: /yql/reference/ddl/create-index.md
to: /yql/reference/syntax/create_table/secondary_index.md
diff --git a/ydb/docs/ru/core/concepts/optimizer.md b/ydb/docs/ru/core/concepts/optimizer.md
index ef634a138de..efdc1458797 100644
--- a/ydb/docs/ru/core/concepts/optimizer.md
+++ b/ydb/docs/ru/core/concepts/optimizer.md
@@ -2,7 +2,7 @@
В {{ ydb-short-name }} используются два типа оптимизаторов запросов: оптимизатор, основанный на правилах, и стоимостной оптимизатор. Стоимостной оптимизатор применяется для сложных запросов, как правило, аналитических ([OLAP](https://ru.wikipedia.org/wiki/OLAP)), а оптимизация по правилам работает на всех запросах.
-План запроса представляет собой граф операций, таких как чтение данных из источника, фильтрация потока данных по предикату, а также более сложные операции, например [JOIN](../yql/reference/syntax/join.md) и [GROUP BY](../yql/reference/syntax/group_by.md). Оптимизаторы в {{ ydb-short-name }} принимают на вход начальный план запроса и преобразуют его в более эффективный план, эквивалентный начальному с точки зрения возвращаемого результата.
+План запроса представляет собой граф операций, таких как чтение данных из источника, фильтрация потока данных по предикату или выполнение более сложных операций, таких как [JOIN](../yql/reference/syntax/select/join.md) и [GROUP BY](../yql/reference/syntax/select/group-by.md). Оптимизаторы в {{ ydb-short-name }} принимают на вход начальный план запроса и преобразуют его в более эффективный план, эквивалентный начальному с точки зрения возвращаемого результата.
## Оптимизатор запросов основанный на правилах
@@ -10,7 +10,7 @@
## Стоимостной оптимизатор запросов
-Для более сложных оптимизаций, таких как выбор оптимального порядка джоина и алгоритмов джоинов используется стоимостной оптимизатор. Для каждого запроса стоимостной оптимизатор рассматривает большое количество альтернативных планов выполнения и выбирает из них лучший на основе оценки стоимости каждого варианта. На текущий момент этот оптимизатор работает только с планами, где есть операции [JOIN](../yql/reference/syntax/join.md). Он выбирает наилучший порядок исполнения этих операций, а также выбирает самую эффективную реализацию для каждого Join в плане.
+Для более сложных оптимизаций, таких как выбор оптимального порядка и алгоритмов JOIN-ов, используется стоимостной оптимизатор. Для каждого запроса стоимостной оптимизатор рассматривает большое количество альтернативных планов выполнения и выбирает из них лучший на основе оценки стоимости каждого варианта. На текущий момент этот оптимизатор работает только с планами, где есть операции [JOIN](../yql/reference/syntax/select/join.md). Он выбирает наилучший порядок исполнения этих операций, а также выбирает самую эффективную реализацию для каждого Join в плане.
Стоимостной оптимизатор состоит из трех основных компонент:
diff --git a/ydb/docs/ru/core/dev/yql-tutorial/join_tables.md b/ydb/docs/ru/core/dev/yql-tutorial/join_tables.md
index 8db90c778dd..9e26b49a2b5 100755
--- a/ydb/docs/ru/core/dev/yql-tutorial/join_tables.md
+++ b/ydb/docs/ru/core/dev/yql-tutorial/join_tables.md
@@ -1,6 +1,6 @@
# Объединение таблиц с помощью JOIN
-Объедините колонки исходных таблиц `seasons` и `series` и выведите все сезоны сериала IT Crowd в результирующей таблице с помощью оператора [JOIN](../../yql/reference/syntax/join.md).
+Объедините колонки исходных таблиц `seasons` и `series` и выведите все сезоны сериала IT Crowd в результирующей таблице с помощью оператора [JOIN](../../yql/reference/syntax/select/join.md).
{% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %}
diff --git a/ydb/docs/ru/core/yql/reference/builtins/aggregation.md b/ydb/docs/ru/core/yql/reference/builtins/aggregation.md
index 7a976d7a27e..e8e5d76b3c9 100644
--- a/ydb/docs/ru/core/yql/reference/builtins/aggregation.md
+++ b/ydb/docs/ru/core/yql/reference/builtins/aggregation.md
@@ -12,7 +12,7 @@ COUNT(T?)->Uint64
Подсчет количества строк в строковой или колоночной таблице (если в качестве аргумента указана `*` или константа) или непустых значений в столбце таблицы (если в качестве аргумента указано имя столбца).
-Как и другие агрегатные функции, может использоваться в сочетании с [GROUP BY](../syntax/group_by.md) для получения статистики по частям таблицы, соответствующим значениям в столбцах, по которым идет группировка. {% if select_statement != "SELECT STREAM" %}А модификатор [DISTINCT](../syntax/group_by.md#distinct) позволяет посчитать число уникальных значений.{% endif %}
+Как и другие агрегатные функции, может использоваться в сочетании с [GROUP BY](../syntax/select/group-by.md) для получения статистики по частям таблицы, соответствующим значениям в столбцах, по которым идет группировка. {% if select_statement != "SELECT STREAM" %}А модификатор [DISTINCT](../syntax/select/group-by.md#distinct) позволяет посчитать число уникальных значений.{% endif %}
### Примеры
@@ -113,13 +113,20 @@ COUNT_IF(Bool?)->Uint64?
```yql
SELECT
COUNT_IF(value % 2 == 1) AS odd_count
+FROM my_table;
```
{% if select_statement != "SELECT STREAM" %}
{% note info %}
-Если нужно посчитать число уникальных значений на строках, где выполняется условие, то в отличие от остальных агрегатных функций модификатор [DISTINCT](../syntax/group_by.md#distinct) тут не поможет, так как в аргументах нет никаких значений. Для получения данного результата, стоит воспользоваться в подзапросе встроенной функцией [IF](basic.md#if) с двумя аргументами (чтобы в else получился `NULL`), а снаружи сделать [COUNT(DISTINCT ...)](#count) по её результату.
+Если нужно посчитать число уникальных значений на строках, где выполняется условие, то в отличие от остальных агрегатных функций модификатор [DISTINCT](../syntax/select/group-by.md#distinct) тут не поможет, так как в аргументах нет никаких значений. Для получения данного результата можно использовать запрос следующего вида:
+
+```yql
+SELECT
+ COUNT(DISTINCT IF(value % 2 == 1, value))
+FROM my_table;
+```
{% endnote %}
@@ -245,7 +252,7 @@ AGGREGATE_LIST_DISTINCT(T [, limit:Uint64])->List<T>
Чтобы получить список нескольких значений с одной строки, важно *НЕ* использовать функцию `AGGREGATE_LIST` несколько раз, а сложить все нужные значения в контейнер, например через [AsList](basic.md#aslist) или [AsTuple](basic.md#astuple) и передать этот контейнер в один вызов `AGGREGATE_LIST`.
-Например, можно использовать в сочетании с `DISTINCT` и функцией [String::JoinFromList](../udf/list/string.md) (аналог `','.join(list)` из Python) для распечатки в строку всех значений, которые встретились в столбце после применения [GROUP BY](../syntax/group_by.md).
+Например, можно использовать в сочетании с `DISTINCT` и функцией [String::JoinFromList](../udf/list/string.md) (аналог `','.join(list)` из Python) для распечатки в строку всех значений, которые встретились в столбце после применения [GROUP BY](../syntax/select/group-by.md).
### Примеры
@@ -621,7 +628,7 @@ While FastGreedyShrink is used most of the time, SlowShrink is mostly used for h
### Если нужна точная гистограмма
1. Можно воспользоваться описанными ниже агрегатными функциями с фиксированными сетками корзин: [LinearHistogram](#linearhistogram) или [LogarithmicHistogram](#linearhistogram).
-2. Можно самостоятельно вычислить номер корзины для каждой строки и сделать по нему [GROUP BY](../syntax/group_by.md).
+2. Можно самостоятельно вычислить номер корзины для каждой строки и сделать по нему [GROUP BY](../syntax/select/group-by.md).
При использовании [фабрики агрегационной функции](basic.md#aggregationfactory) в качестве первого аргумента [AGGREGATE_BY](#aggregate-by) передается `Tuple` из значения и веса.
@@ -782,10 +789,10 @@ FROM my_table;
## SessionStart {#session-start}
-Без аргументов. Допускается только при наличии [SessionWindow](../syntax/group_by.md#session-window) в
-[GROUP BY](../syntax/group_by.md) / [PARTITION BY](../syntax/window.md#partition).
+Без аргументов. Допускается только при наличии [SessionWindow](../syntax/select/group-by.md#session-window) в
+[GROUP BY](../syntax/select/group-by.md) / [PARTITION BY](../syntax/select/window.md#partition).
Возвращает значение ключевой колонки `SessionWindow`. В случае `SessionWindow` с двумя аргументами – минимальное значение первого аргумента внутри группы/раздела.
-В случае раширенного варианта `SessionWindoow` – значение второго элемента кортежа, возвращаемого `<calculate_lambda>`, при котором первый элемент кортежа равен `True`.
+В случае расширенного варианта `SessionWindow` – значение второго элемента кортежа, возвращаемого `<calculate_lambda>`, при котором первый элемент кортежа равен `True`.
{% endif %}
diff --git a/ydb/docs/ru/core/yql/reference/builtins/basic.md b/ydb/docs/ru/core/yql/reference/builtins/basic.md
index 943413c2d1a..b85834a1b87 100644
--- a/ydb/docs/ru/core/yql/reference/builtins/basic.md
+++ b/ydb/docs/ru/core/yql/reference/builtins/basic.md
@@ -1,4 +1,3 @@
-
# Базовые встроенные функции
Ниже описаны функции общего назначения, а для специализированных функций есть отдельные статьи: [агрегатные](aggregation.md){% if feature_window_functions %}, [оконные](window.md){% endif %}, а также для работы со [списками](list.md), [словарями](dict.md), [структурами](struct.md), [типами данных](types.md){% if feature_codegen %} и [генерацией кода](codegen.md){% endif %}.
@@ -1601,15 +1600,15 @@ $f($el_n, ...$f($el_2, $f($f0($init), el_1))...)
## AggregationFactory {#aggregationfactory}
-Создать фабрику для [агрегационных функций](aggregation.md) для того чтобы разделить процесс описания того, как агрегировать данные, и то, к каким данным это применять.
+Создать фабрику для [агрегатных функций](aggregation.md) для того чтобы разделить процесс описания того, как агрегировать данные, и то, к каким данным это применять.
Аргументы:
-1. Строка в кавычках, являющаяся именем агрегационной функции, например ["MIN"](aggregation.md#min).
-2. Опциональные параметры агрегационной функции, которые не зависят от данных. Например, значение percentile в [PERCENTILE](aggregation.md#percentile).
+1. Строка в кавычках, являющаяся именем агрегатной функции, например ["MIN"](aggregation.md#min).
+2. Опциональные параметры агрегатной функции, которые не зависят от данных. Например, значение percentile в [PERCENTILE](aggregation.md#percentile).
Полученную фабрику можно использовать как второй параметр функции [AGGREGATE_BY](aggregation.md#aggregateby).
-Если агрегационная функция работает на двух колонках вместо одной, как например, [MIN_BY](aggregation.md#minby), то в [AGGREGATE_BY](aggregation.md#aggregateby) первым аргументом передается `Tuple` из двух значений. Подробнее это указано при описании такой агрегационной функции.
+Если агрегатная функция работает на двух колонках вместо одной, как например, [MIN_BY](aggregation.md#minby), то в [AGGREGATE_BY](aggregation.md#aggregateby) первым аргументом передается `Tuple` из двух значений. Подробнее это указано при описании такой агрегатной функции.
### Примеры
@@ -1622,11 +1621,11 @@ FROM my_table;
## AggregateTransformInput {#aggregatetransform}
-`AggregateTransformInput()` преобразует фабрику для [агрегационных функций](aggregation.md), например, полученную через функцию [AggregationFactory](#aggregationfactory) в другую фабрику, в которой перед началом выполнения агрегации производится указанное преобразование входных элементов.
+`AggregateTransformInput()` преобразует фабрику для [агрегатных функций](aggregation.md), например, полученную через функцию [AggregationFactory](#aggregationfactory) в другую фабрику, в которой перед началом выполнения агрегации производится указанное преобразование входных элементов.
Аргументы:
-1. Фабрика для агрегационных функций;
+1. Фабрика для агрегатных функций;
2. Лямбда функция с одним аргументом, преобразующая входной элемент.
### Примеры
@@ -1642,11 +1641,11 @@ SELECT ListAggregate([1,2,3], $h); -- 12
## AggregateTransformOutput {#aggregatetransformoutput}
-`AggregateTransformOutput()` преобразует фабрику для [агрегационных функций](aggregation.md), например, полученную через функцию [AggregationFactory](#aggregationfactory) в другую фабрику, в которой после окончания выполнения агрегации производится указанное преобразование результата.
+`AggregateTransformOutput()` преобразует фабрику для [агрегатных функций](aggregation.md), например, полученную через функцию [AggregationFactory](#aggregationfactory) в другую фабрику, в которой после окончания выполнения агрегации производится указанное преобразование результата.
Аргументы:
-1. Фабрика для агрегационных функций;
+1. Фабрика для агрегатных функций;
2. Лямбда функция с одним аргументом, преобразующая результат.
### Примеры
@@ -1660,11 +1659,11 @@ SELECT ListAggregate([1,2,3], $g); -- 12
## AggregateFlatten {#aggregateflatten}
-Адаптирует фабрику для [агрегационных функций](aggregation.md), например, полученную через функцию [AggregationFactory](#aggregationfactory) так, чтобы выполнять агрегацию над входными элементами - списками. Эта операция похожа на [FLATTEN LIST BY](../syntax/flatten.md) - производится агрегация каждого элемента списка.
+Адаптирует фабрику для [агрегатных функций](aggregation.md), (например, полученную через функцию [AggregationFactory](#aggregationfactory)) так, чтобы выполнять агрегацию над входными элементами - списками. Эта операция похожа на [FLATTEN LIST BY](../syntax/select/flatten.md) - производится агрегация каждого элемента списка.
Аргументы:
-1. Фабрика для агрегационных функций.
+1. Фабрика для агрегатных функций.
### Примеры
diff --git a/ydb/docs/ru/core/yql/reference/builtins/window.md b/ydb/docs/ru/core/yql/reference/builtins/window.md
index 357400d381e..5239b87cad1 100644
--- a/ydb/docs/ru/core/yql/reference/builtins/window.md
+++ b/ydb/docs/ru/core/yql/reference/builtins/window.md
@@ -1,13 +1,13 @@
# Список оконных функций в YQL
-Синтаксис вызова оконных функций подробно описан в [отдельной статье](../syntax/window.md).
+Синтаксис вызова оконных функций подробно описан в [отдельной статье](../syntax/select/window.md).
## Агрегатные функции {#aggregate-functions}
Все [агрегатные функции](aggregation.md) также могут использоваться в роли оконных.
-В этом случае на каждой строке оказывается результат агрегации, полученный на множестве строк из [рамки окна](../syntax/window.md#frame).
+В этом случае на каждой строке оказывается результат агрегации, полученный на множестве строк из [рамки окна](../syntax/select/window.md#frame).
### Примеры
@@ -24,7 +24,7 @@ WINDOW
## ROW_NUMBER {#row_number}
-Номер строки в рамках [раздела](../syntax/window.md#partition). Без аргументов.
+Номер строки в рамках [раздела](../syntax/select/window.md#partition). Без аргументов.
### Сигнатура
@@ -44,7 +44,7 @@ WINDOW w AS (ORDER BY key);
## LAG / LEAD {#lag-lead}
-Доступ к значению из строки [раздела](../syntax/window.md#partition), отстающей (`LAG`) или опережающей (`LEAD`) текущую на фиксированное число. В первом аргументе указывается выражение, к которому необходим доступ, а во втором — отступ в строках. Отступ можно не указывать, по умолчанию используется соседняя строка — предыдущая или следующая, соответственно, то есть подразумевается 1. В строках, для которых нет соседей с заданным расстоянием (например `LAG(expr, 3)` в первой и второй строках раздела), возвращается `NULL`.
+Доступ к значению из строки [раздела](../syntax/select/window.md#partition), отстающей (`LAG`) или опережающей (`LEAD`) текущую на фиксированное число. В первом аргументе указывается выражение, к которому необходим доступ, а во втором — отступ в строках. Отступ можно не указывать, по умолчанию используется соседняя строка — предыдущая или следующая, соответственно, то есть подразумевается 1. В строках, для которых нет соседей с заданным расстоянием (например `LAG(expr, 3)` в первой и второй строках раздела), возвращается `NULL`.
### Сигнатура
@@ -90,7 +90,7 @@ item odd lag1
## FIRST_VALUE / LAST_VALUE
-Доступ к значениям из первой и последней (в порядке `ORDER BY` на окне) строк [рамки окна](../syntax/window.md#frame). Единственный аргумент - выражение, к которому необходим доступ.
+Доступ к значениям из первой и последней (в порядке `ORDER BY` на окне) строк [рамки окна](../syntax/select/window.md#frame). Единственный аргумент - выражение, к которому необходим доступ.
Опционально перед `OVER` может указываться дополнительный модификатор `IGNORE NULLS`, который меняет поведение функций на первое или последнее **не пустое** (то есть не `NULL`) значение среди строк рамки окна. Антоним этого модификатора — `RESPECT NULLS` является поведением по умолчанию и может не указываться.
@@ -119,9 +119,9 @@ WINDOW w AS (ORDER BY key);
## NTH_VALUE
-Доступ к значения из заданной строки (в порядке `ORDER BY` на окне) [рамки окна](../syntax/window.md#frame). Аргументы - выражение, к которому необходим доступ и номер строки, начиная с 1.
+Доступ к значения из заданной строки (в порядке `ORDER BY` на окне) [рамки окна](../syntax/select/window.md#frame). Аргументы - выражение, к которому необходим доступ и номер строки, начиная с 1.
-Опционально перед `OVER` может указываться дополнительный модификатор `IGNORE NULLS`, который приводит к пропуску строк с NULL в значении первого аргумента. Антоним этого модификатора — `RESPECT NULLS` является поведением по умолчанию и может не указываться.
+Опционально перед `OVER` может указываться дополнительный модификатор `IGNORE NULLS`, который приводит к пропуску строк с NULL в значении первого аргумента. Антоним этого модификатора `RESPECT NULLS` является поведением по умолчанию и может не указываться.
### Сигнатура
@@ -148,7 +148,7 @@ WINDOW w AS (ORDER BY key);
## RANK / DENSE_RANK / PERCENT_RANK {#rank}
-Пронумеровать группы соседних строк [раздела](../syntax/window.md#partition) с одинаковым значением выражения в аргументе. `DENSE_RANK` нумерует группы подряд, а `RANK` — пропускает `(N - 1)` значений, где `N` — число строк в предыдущей группе. `PERCENT_RANK` выдает относительный ранг текущей строки: `(RANK - 1)/(число строк в разделе - 1)`.
+Пронумеровать группы соседних строк [раздела](../syntax/select/window.md#partition) с одинаковым значением выражения в аргументе. `DENSE_RANK` нумерует группы подряд, а `RANK` — пропускает `(N - 1)` значений, где `N` — число строк в предыдущей группе. `PERCENT_RANK` выдает относительный ранг текущей строки: `(RANK - 1)/(число строк в разделе - 1)`.
При отсутствии аргумента использует порядок, указанный в секции `ORDER BY` определения окна.
Если аргумент отсутствует и `ORDER BY` не указан, то все строки считаются равными друг другу.
@@ -193,7 +193,7 @@ WINDOW w AS (ORDER BY my_column);
## NTILE
-Распределяет строки упорядоченного [раздела](../syntax/window.md#partition) в заданное количество групп. Группы нумеруются, начиная с единицы. Для каждой строки функция NTILE возвращает номер группы,которой принадлежит строка.
+Распределяет строки упорядоченного [раздела](../syntax/select/window.md#partition) в заданное количество групп. Группы нумеруются, начиная с единицы. Для каждой строки функция NTILE возвращает номер группы,которой принадлежит строка.
### Сигнатура
@@ -213,7 +213,7 @@ WINDOW w AS (ORDER BY key);
## CUME_DIST
-Возвращает относительную позицию (> 0 и <= 1) строки в рамках [раздела](../syntax/window.md#partition). Без аргументов.
+Возвращает относительную позицию (> 0 и <= 1) строки в рамках [раздела](../syntax/select/window.md#partition). Без аргументов.
### Сигнатура
@@ -234,7 +234,7 @@ WINDOW w AS (ORDER BY key);
## SessionState() {#session-state}
-Нестандартная оконная функция `SessionState()` (без аргументов) позволяет получить состояние расчета сессий из [SessionWindow](../syntax/group_by.md#session-window) для текущей строки.
+Нестандартная оконная функция `SessionState()` (без аргументов) позволяет получить состояние расчета сессий из [SessionWindow](../syntax/select/group-by.md#session-window) для текущей строки.
Допускается только при наличии `SessionWindow()` в секции `PARTITION BY` определения окна.
diff --git a/ydb/docs/ru/core/yql/reference/syntax/expressions.md b/ydb/docs/ru/core/yql/reference/syntax/expressions.md
index bba831c3f8b..d2f0d1d824c 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/expressions.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/expressions.md
@@ -474,7 +474,7 @@ $x, $y = AsTuple($y, $x); -- swap значений выражений
Здесь табличные выражения работают как ожидается – например `$input = SELECT a, b, c FROM T; SELECT * FROM $input` вернет таблицу с тремя колонками.
- Табличный контекст также возникает после [UNION ALL](select/index.md#unionall){% if feature_join %}, [JOIN](join.md#join){% endif %}{% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](process.md#process), [REDUCE](reduce.md#reduce){% endif %};
+ Табличный контекст также возникает после [UNION ALL](select/index.md#unionall){% if feature_join %}, [JOIN](select/join.md#join){% endif %}{% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](process.md#process), [REDUCE](reduce.md#reduce){% endif %};
* векторный контекст - после [IN](#in). В этом контексте табличное выражение обязано содержать ровно одну колонку (имя этой колонки никак не влияет на результат выражения).
diff --git a/ydb/docs/ru/core/yql/reference/syntax/index.md b/ydb/docs/ru/core/yql/reference/syntax/index.md
index 438d5656431..bc90eb9cfdb 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/index.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/index.md
@@ -42,21 +42,6 @@
{% endif %}
-* [GROUP BY](group_by.md)
-
-{% if feature_join %}
-
-* [JOIN](join.md)
-
-{% endif %}
-
-{% if feature_window_functions %}
-
-* [WINDOW](window.md)
-
-{% endif %}
-
-* [FLATTEN](flatten.md)
* [ACTION](action.md)
{% if feature_mapreduce and process_command == "PROCESS" %}
diff --git a/ydb/docs/ru/core/yql/reference/syntax/join.md b/ydb/docs/ru/core/yql/reference/syntax/join.md
index 7c2bf67e006..3a4da2bbba8 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/join.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/join.md
@@ -1,4 +1,3 @@
-
# JOIN
Позволяет объединить несколько источников данных (подзапросов или таблиц) по равенству значений указанных столбцов или выражений (ключей `JOIN`).
@@ -144,6 +143,4 @@ ON a.key == b.key;
|"2"|"v122"|"v221"|
|"2"|"v122"|"v222"|
-{% endif %}
-
-
+{% endif %} \ No newline at end of file
diff --git a/ydb/docs/ru/core/yql/reference/syntax/pragma.md b/ydb/docs/ru/core/yql/reference/syntax/pragma.md
index d90b314af13..84bea8615df 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/pragma.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/pragma.md
@@ -153,7 +153,7 @@ SELECT * FROM test;
При использовании `SELECT foo.* FROM ... AS foo` убрать префикс `foo.` у имен результирующих колонок.
-Работает в том числе и для [JOIN](join.md), но в этом случае имеет право упасть в случае конфликта имен (который можно разрешить с помощью [WITHOUT](select/without.md) и переименования колонок). Для JOIN в режиме SimpleColumns производится неявный Coalesce для ключевых колонок: запрос `SELECT * FROM T1 AS a JOIN T2 AS b USING(key)` в режиме SimpleColumns работает как `SELECT a.key ?? b.key AS key, ... FROM T1 AS a JOIN T2 AS b USING(key)`
+Работает в том числе и для [JOIN](select/join.md), но в этом случае имеет право упасть в случае конфликта имен (который можно разрешить с помощью [WITHOUT](select/without.md) и переименования колонок). Для JOIN в режиме SimpleColumns производится неявный Coalesce ключевых колонок: запрос `SELECT * FROM T1 AS a JOIN T2 AS b USING(key)` в режиме SimpleColumns работает аналогично `SELECT a.key ?? b.key AS key, ... FROM T1 AS a JOIN T2 AS b USING(key)`.
### CoalesceJoinKeysOnQualifiedAll
@@ -173,7 +173,7 @@ SELECT * FROM test;
| --- | --- |
| Флаг | false |
-Если флаг установлен, то [JOIN](join.md) будет требовать строгого совпадения типов ключей.
+Если флаг установлен, то [JOIN](select/join.md) будет требовать строгого совпадения типов ключей.
По умолчанию JOIN предварительно конвертирует ключи к общему типу, что может быть нежелательно с точки зрения производительности.
StrictJoinKeyTypes является [scoped](#pragmascope) настройкой.
@@ -302,7 +302,7 @@ WarnUntypedStringLiterals является [scoped](#pragmascope) настрой
| --- | --- |
| Положительное число | 32 |
-Увеличение лимита на число группировок в [GROUP BY](group_by.md).
+Увеличение лимита на число группировок в [GROUP BY](select/group-by.md).
{% if feature_group_by_rollup_cube %}
@@ -312,7 +312,7 @@ WarnUntypedStringLiterals является [scoped](#pragmascope) настрой
| --- | --- |
| Положительное число | 5 |
-Увеличение лимита на число размерностей [GROUP BY](group_by.md#rollup-cube-group-sets).
+Увеличение лимита на число размерностей [GROUP BY](select/group-by.md#rollup-cube-group-sets).
Использовать нужно аккуратно, так как вычислительная сложность запроса растет экспоненциально по отношению к числу размерностей.
diff --git a/ydb/docs/ru/core/yql/reference/syntax/_assets/join-YQL-06.png b/ydb/docs/ru/core/yql/reference/syntax/select/_assets/join-YQL-06.png
index aae84322b7c..aae84322b7c 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/_assets/join-YQL-06.png
+++ b/ydb/docs/ru/core/yql/reference/syntax/select/_assets/join-YQL-06.png
Binary files differ
diff --git a/ydb/docs/ru/core/yql/reference/syntax/select/distinct.md b/ydb/docs/ru/core/yql/reference/syntax/select/distinct.md
index 13ff5d78d5b..5c54cda7fa1 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/select/distinct.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/select/distinct.md
@@ -4,7 +4,7 @@
{% note info %}
-Применение `DISTINCT` к вычислимым значениям на данный момент не реализовано. С этой целью можно использовать подзапрос или выражение [`GROUP BY ... AS ...`](../group_by.md).
+Применение `DISTINCT` к вычислимым значениям на данный момент не реализовано. С этой целью можно использовать подзапрос или выражение [`GROUP BY ... AS ...`](group-by.md).
{% endnote %}
@@ -15,4 +15,4 @@ SELECT DISTINCT value -- только уникальные значения из
FROM my_table;
```
-Также ключевое слово `DISTINCT` может использоваться для применения [агрегатных функций](../../builtins/aggregation.md) только к уникальным значениям. Подробнее см. в документации по [GROUP BY](../group_by.md).
+Также ключевое слово `DISTINCT` может использоваться для применения [агрегатных функций](../../builtins/aggregation.md) только к уникальным значениям. Подробнее см. в документации по [GROUP BY](group-by.md).
diff --git a/ydb/docs/ru/core/yql/reference/syntax/flatten.md b/ydb/docs/ru/core/yql/reference/syntax/select/flatten.md
index a59b1ac0d7e..bf08c018678 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/flatten.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/select/flatten.md
@@ -2,7 +2,7 @@
## FLATTEN BY {#flatten-by}
-Преобразует строки исходной таблицы с помощью вертикального разворачивания [контейнеров](../types/containers.md) переменной длины (списков или словарей).
+Преобразует строки исходной таблицы с помощью вертикального разворачивания [контейнеров](../../types/containers.md) переменной длины (списков или словарей).
Например:
@@ -41,10 +41,8 @@ SELECT value, id FROM as_table($sample) FLATTEN BY (value);
Такое преобразование может быть удобным в следующих случаях:
-* Когда по ячейкам из столбца-контейнера необходимо вывести статистику (например, через [`GROUP BY`](group_by.md)).
-{% if feature_join %}
+* Когда по ячейкам из столбца-контейнера необходимо вывести статистику (например, через [`GROUP BY`](group-by.md)).
* Когда в ячейках столбца-контейнера хранятся идентификаторы из другой таблицы, которую нужно присоединить с помощью [`JOIN`](join.md).
-{% endif %}
### Синтаксис
@@ -65,7 +63,7 @@ SELECT value, id FROM as_table($sample) FLATTEN BY (value);
{% note info %}
-`FLATTEN BY` интерпретирует [опциональные типы данных](../types/optional.md) как списки длины 0 или 1. Строки таблицы с `NULL` пропускаются, и тип столбца меняется на аналогичный неопциональный.
+`FLATTEN BY` интерпретирует [опциональные типы данных](../../types/optional.md) как списки длины 0 или 1. Строки таблицы с `NULL` пропускаются, и тип столбца меняется на аналогичный неопциональный.
`FLATTEN BY` делает только одно преобразование за раз, поэтому на опциональных контейнерах, например, `Optional<List<String>>` следует использовать `FLATTEN LIST BY` или `FLATTEN OPTIONAL BY`.
diff --git a/ydb/docs/ru/core/yql/reference/syntax/group_by.md b/ydb/docs/ru/core/yql/reference/syntax/select/group-by.md
index 3ea0e69e621..8411f4a40e6 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/group_by.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/select/group-by.md
@@ -2,7 +2,7 @@
## GROUP BY
-Группирует результаты `SELECT` по значениям указанных столбцов или выражений. Вместе с `GROUP BY` часто применяются [агрегатные функции](../builtins/aggregation.md) (`COUNT`, `MAX`, `MIN`, `SUM`, `AVG`) для выполнения вычислений в каждой группе.
+Группирует результаты `SELECT` по значениям указанных столбцов или выражений. Вместе с `GROUP BY` часто применяются [агрегатные функции](../../builtins/aggregation.md) (`COUNT`, `MAX`, `MIN`, `SUM`, `AVG`) для выполнения вычислений в каждой группе.
Если `GROUP BY` присутствует в запросе, то при выборке столбцов (между `SELECT ... FROM`) допустимы следующие конструкции:
@@ -31,7 +31,7 @@ GROUP BY
-- которое может быть использовано в SELECT
```
-Запрос вида `SELECT * FROM table GROUP BY k1, k2, ...` вернет все колонки, перечисленные в GROUP BY, то есть экивалентент запросу `SELECT DISTINCT k1, k2, ... FROM table`.
+Запрос вида `SELECT * FROM table GROUP BY k1, k2, ...` вернет все колонки, перечисленные в GROUP BY, то есть эквивалентен запросу `SELECT DISTINCT k1, k2, ... FROM table`.
Звездочка может также применяться в качестве аргумента агрегатной функции `COUNT`. `COUNT(*)` означает "число строк в группе".
@@ -42,7 +42,7 @@ GROUP BY
{% endnote %}
-Также в YQL доступен механизм фабрик агрегатных функций, реализованный с помощью функций [`AGGREGATION_FACTORY`](../builtins/basic.md#aggregationfactory) и [`AGGREGATE_BY`](../builtins/aggregation.md#aggregateby).
+Также в YQL доступен механизм фабрик агрегатных функций, реализованный с помощью функций [`AGGREGATION_FACTORY`](../../builtins/basic.md#aggregationfactory) и [`AGGREGATE_BY`](../../builtins/aggregation.md#aggregateby).
### Примеры {#examples}
@@ -75,7 +75,7 @@ GROUP BY
{% note warning %}
-Возможность указывать имя для колонки или выражения в `GROUP BY .. AS foo` является расширением YQL. Такое имя становится видимым в `WHERE` несмотря на то, что фильтрация по `WHERE` выполняется [раньше](select/index.md#selectexec) группировки. В частности, если в таблице `T` есть две колонки `foo` и `bar`, то в запросе `SELECT foo FROM T WHERE foo > 0 GROUP BY bar AS foo` фильтрация фактически произойдет по колонке `bar` из исходной таблицы.
+Возможность указывать имя для колонки или выражения в `GROUP BY .. AS foo` является расширением YQL. Такое имя становится видимым в `WHERE` несмотря на то, что фильтрация по `WHERE` выполняется [раньше](../index.md#selectexec) группировки. В частности, если в таблице `T` есть две колонки `foo` и `bar`, то в запросе `SELECT foo FROM T WHERE foo > 0 GROUP BY bar AS foo` фильтрация фактически произойдет по колонке `bar` из исходной таблицы.
{% endnote %}
@@ -103,7 +103,7 @@ GROUP BY user, SessionWindow(<time_expr>, <timeout_expr>) AS session_start
Ключевая колонка SessionWindow() (в примере `session_start`) имеет значение "минимальный `time_expr` в сессии".
Кроме того, при наличии SessionWindow() в `GROUP BY` может использоваться специальная агрегатная функция
-[SessionStart](../builtins/aggregation.md#session-start).
+[SessionStart](../../builtins/aggregation.md#session-start).
Поддерживается также расширенный вариант SessionWindow с четырьмя аргументами:
@@ -225,11 +225,11 @@ GROUP BY
## DISTINCT {#distinct}
-Применение [агрегатных функций](../builtins/aggregation.md) только к уникальным значениям столбца.
+Применение [агрегатных функций](../../builtins/aggregation.md) только к уникальным значениям столбца.
{% note info %}
-Применение `DISTINCT` к вычислимым значениям на данный момент не реализовано. С этой целью можно использовать [подзапрос](select/from.md) или выражение `GROUP BY ... AS ...`.
+Применение `DISTINCT` к вычислимым значениям на данный момент не реализовано. С этой целью можно использовать [подзапрос](from.md) или выражение `GROUP BY ... AS ...`.
{% endnote %}
@@ -245,13 +245,13 @@ ORDER BY count DESC
LIMIT 3;
```
-Также ключевое слово `DISTINCT` может использоваться для выборки уникальных строк через [`SELECT DISTINCT`](select/distinct.md).
+Также ключевое слово `DISTINCT` может использоваться для выборки уникальных строк через [`SELECT DISTINCT`](distinct.md).
## COMPACT
-Наличие [SQL хинта](lexer.md#sql-hints) `COMPACT` непосредственно после ключевого слова `GROUP` позволяет более эффективно выполнять агрегацию в тех случаях, когда автору запроса заранее известно, что ни по одному из ключей агрегации не встречаются большие объемы данных (больше примерно гигабайт или миллионов строк). Если это предположение на практике окажется неверным, то операция может завершиться ошибкой из-за превышения потребления оперативной памяти или работать значительно медленнее не-COMPACT версии.
+Наличие [SQL хинта](../lexer.md#sql-hints) `COMPACT` непосредственно после ключевого слова `GROUP` позволяет более эффективно выполнять агрегацию в тех случаях, когда автору запроса заранее известно, что ни по одному из ключей агрегации не найдется большого количества данных (порядка гигабайта или миллиона строк). Если это предположение не оправдается, то операция может упасть с ошибкой Out of Memory или начать работать значительно медленнее по сравнению с обычным GROUP BY.
В отличие от обычного GROUP BY, отключается стадия Map-side combiner и дополнительные Reduce для каждого поля с [DISTINCT](#distinct) агрегацией.
@@ -302,7 +302,7 @@ HOP(time_extractor, hop, interval, delay)
Параметр `delay` в текущей реализации игнорируется т.к. данные в одной партиции уже отсортированы.
{% endif %}
-Для задания `hop`, `interval` и `delay` используется строковое выражение, соответствующее стандарту [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601). Это формат, который используется для конструирования встроенного типа `Interval` [из строки](../builtins/basic.md#data-type-literals).
+Для задания `hop`, `interval` и `delay` используется строковое выражение, соответствующее стандарту [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601). Это формат, который используется для конструирования встроенного типа `Interval` [из строки](../../builtins/basic.md#data-type-literals).
При выборке столбцов (между `SELECT ... FROM`) можно использовать функции `HOP_START` и `HOP_END` (без параметров), которые возвращают значение типа `Timestamp` и соответствуют началу и концу текущего окна.
@@ -336,7 +336,7 @@ GROUP BY
## HAVING {#having}
-Фильтрация выборки `SELECT` по результатам вычисления [агрегатных функций](../builtins/aggregation.md). Синтаксис аналогичен конструкции [`WHERE`](select/where.md).
+Фильтрация выборки `SELECT` по результатам вычисления [агрегатных функций](../../builtins/aggregation.md). Синтаксис аналогичен конструкции [`WHERE`](where.md).
### Пример
diff --git a/ydb/docs/ru/core/yql/reference/syntax/select/index.md b/ydb/docs/ru/core/yql/reference/syntax/select/index.md
index 75ee0383c80..59a1663b9ab 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/select/index.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/select/index.md
@@ -22,16 +22,14 @@ SELECT 2 + 2;
* определяется набор входных таблиц – вычисляются выражения после [FROM](../select/from.md);
* к входным таблицам применяется [MATCH_RECOGNIZE](match_recognize.md)
* вычисляется [SAMPLE](sample.md) / [TABLESAMPLE](sample.md)
-* выполняется [FLATTEN COLUMNS](../flatten.md#flatten-columns) или [FLATTEN BY](../flatten.md); алиасы, заданные во `FLATTEN BY`, становятся видны после этой точки;
-{% if feature_join %}
-* выполняются все [JOIN](../join.md);
-{% endif %}
-* к полученным данным добавляются (или заменяются) колонки, заданные в [GROUP BY ... AS ...](../group_by.md);
-* выполняется [WHERE](where.md) &mdash; все данные не удовлетворяющие предикату отфильтровываются;
-* выполняется [GROUP BY](../group_by.md), вычисляются значения агрегатных функций;
-* выполняется фильтрация [HAVING](../group_by.md#having);
+* выполняется [FLATTEN COLUMNS](flatten.md#flatten-columns) или [FLATTEN BY](flatten.md); алиасы, заданные во `FLATTEN BY`, становятся видны после этой точки;
+* выполняются все [JOIN](join.md);
+* к полученным данным добавляются (или заменяются) колонки, заданные в [GROUP BY ... AS ...](group-by.md);
+* выполняется [WHERE](where.md): все данные, не удовлетворяющие предикату, отфильтровываются;
+* выполняется [GROUP BY](group-by.md), вычисляются значения агрегатных функций;
+* выполняется фильтрация [HAVING](group-by.md#having);
{% if feature_window_functions %}
-* вычисляются значения [оконных функций](../window.md);
+* вычисляются значения [оконных функций](window.md);
{% endif %}
* вычисляются выражения в `SELECT`;
* выражениям в `SELECT` назначаются имена заданные алиасами;
@@ -55,11 +53,7 @@ SELECT 2 + 2;
* `SELECT` с явным перечислением колонок задает соответствующий порядок;
* `SELECT` со звездочкой (`SELECT * FROM ...`) наследует порядок из своего входа;
-{% if feature_join %}
-
-* порядок колонок после [JOIN](../join.md): сначала колонки левой стороны, потом правой. Если порядок какой-либо из сторон присутствующей в выходе `JOIN` не определен, порядок колонок результата также не определен;
-
-{% endif %}
+* порядок колонок после [JOIN](join.md): сначала колонки левой стороны, потом правой. Если порядок какой-либо из сторон, присутствующей в выходе `JOIN`, не определен, порядок колонок результата также не определен;
* порядок `UNION ALL` зависит от режима выполнения [UNION ALL](union.md#union-all);
* порядок колонок для [AS_TABLE](from_as_table.md) не определен;
@@ -224,6 +218,10 @@ SELECT * FROM FILTER(
* [SAMPLE](sample.md)
* [TABLESAMPLE](sample.md)
* [MATCH_RECOGNIZE](match_recognize.md)
+* [JOIN](join.md)
+* [GROUP BY](group-by.md)
+* [FLATTEN](flatten.md)
+* [WINDOW](window.md)
{% if yt %}
diff --git a/ydb/docs/ru/core/yql/reference/syntax/select/join.md b/ydb/docs/ru/core/yql/reference/syntax/select/join.md
new file mode 100644
index 00000000000..adad8f9dee4
--- /dev/null
+++ b/ydb/docs/ru/core/yql/reference/syntax/select/join.md
@@ -0,0 +1,149 @@
+
+# JOIN
+
+Позволяет объединить несколько источников данных (подзапросов или таблиц) по равенству значений указанных столбцов или выражений (ключей `JOIN`).
+
+## Синтаксис
+
+```yql
+SELECT ... FROM table_1
+-- первый шаг объединения:
+ <Join_Type> JOIN table_2 <Join_Condition>
+ -- исходная выборка -- записи в таблице table_1
+ -- присоединяемая выборка -- записи в таблице table_2
+-- следующий шаг объединения:
+ <Join_Type> JOIN table_n <Join_Condition>
+ -- исходная выборка -- результат объединения на предыдущем шаге
+ -- присоединяемая выборка -- записи в таблице table_n
+-- могут быть следующие шаги объединения
+...
+WHERE ...
+```
+
+На каждом шаге объединения по заданным правилам определяются соответствия между строками исходной и присоединяемой выборок данных, и формируется новая выборка, в которую попадают все сочетания подошедших под условия объединения строк.
+
+{% note warning "Внимание" %}
+
+Так как колонки в YQL идентифицируются по именам, и в выборке не может быть двух колонок с одинаковыми именами, `SELECT * FROM ... JOIN ...` не может быть исполнен при наличии колонок с одинаковыми именами в объединяемых таблицах.
+
+{% endnote %}
+
+## Типы объединения (Join_Type)
+
+* `INNER` <span style="color: gray;">(по умолчанию)</span> — Строки объединяемых выборок, для которых не найдено соответствие ни с одной строкой с другой стороны, не попадут в результат.
+* `LEFT` - При отсутствии значения в присоединяемой выборке включает строку в результат со значениями колонок из исходной выборки, оставляя пустыми (`NULL`) колонки присоединяемой выборки
+* `RIGHT` - При отсутствии значения в исходной выборке включает строку в результат со значениями колонок из присоединяемой выборки, оставляя пустыми (`NULL`) колонки исходной выборки
+* `FULL` = `LEFT` + `RIGHT`
+* `LEFT/RIGHT SEMI` — одна сторона выступает как белый список (whitelist) ключей, её значения недоступны. В результат включаются столбцы только из одной таблицы, декартового произведения не возникает;
+* `LEFT/RIGHT ONLY` — вычитание множеств по ключам (blacklist). Практически эквивалентно добавлению условия `IS NULL` на ключ противоположной стороны в обычном `LEFT/RIGHT`, но, как и в `SEMI`, нет доступа к значениям;
+* `CROSS` — декартово произведение двух таблиц целиком без указания ключевых колонок, секция с `ON/USING` явно не пишется;
+* `EXCLUSION` — обе стороны минус пересечение.
+
+![JOIN](_assets/join-YQL-06.png)
+
+{% note info %}
+
+`NULL` является особым значением, которое ничему не равно. Таким образом, `NULL` с двух сторон не считаются равными друг другу. Это избавляет от неоднозначности в некоторых типах `JOIN`, а также от гигантского декартового произведения, которое часто возникает в противном случае.
+
+{% endnote %}
+
+## Условия объединения (Join_Condition)
+
+Для `CROSS JOIN` условие объединения не указывается. В результат попадет декартово произведение исходной и присоединяемой выборок, то есть сочетание всех со всеми. Количество строк в результирующей выборке будет произведением количества строк исходной и присоединяемой выборок.
+
+Для любых других типов объединения необходимо указать условие одним из двух способов:
+
+1. `USING (column_name)`. Используется при наличии в исходной и присоединяемой выборках одноименной колонки, равенство значений в которой является условием объединения.
+2. `ON (equality_conditions)`. Позволяет задать условие равенства значений колонок или выражений над колонками исходной и присоединяемой выборок, или несколько таких условий, объединенных по `and`.
+
+### Примеры
+
+```yql
+SELECT a.value as a_value, b.value as b_value
+FROM a_table AS a
+FULL JOIN b_table AS b USING (key);
+```
+
+```yql
+SELECT a.value as a_value, b.value as b_value
+FROM a_table AS a
+FULL JOIN b_table AS b ON a.key = b.key;
+```
+
+```yql
+SELECT a.value as a_value, b.value as b_value, c.column2
+FROM a_table AS a
+CROSS JOIN b_table AS b
+LEFT JOIN c_table AS c ON c.ref = a.key and c.column1 = b.value;
+```
+
+Для исключения необходимости в полном сканировании правой присоединяемой таблицы может использоваться вторичный индекс над колонками, входящими в условие соединения. Обращение ко вторичному индексу должно быть указано в явном виде, в формате `JOIN table_name VIEW index_name AS table_alias`.
+
+Например, создание индекса для использования в условии соединения:
+
+```yql
+ALTER TABLE b_table ADD INDEX b_index_ref GLOBAL ON(ref);
+```
+
+Использование созданного индекса:
+
+```yql
+SELECT a.value as a_value, b.value as b_value
+FROM a_table AS a
+INNER JOIN b_table VIEW b_index_ref AS b ON a.ref = b.ref;
+```
+
+{% if feature_mapreduce %}
+
+Если в выражении помимо `JOIN` выполняется фильтрация данных, то рекомендуется обернуть те условия, про которые известно, что они вернут `true` для большинства строк, в вызов функции `LIKELY(...)`. Если предположение о преобладании положительных значений в условии окажется верно, такая подсказка может положительно сказаться на времени выполнения запроса. Также `LIKELY` может быть полезен в том случае, когда вычисление предиката ресурсоёмко и при этом сам JOIN значительно сокращает число строк.
+
+Перед любым источником данных для `JOIN` можно указать ключевое слово `ANY`, которое служит для подавления дубликатов по ключам `JOIN` с соответствующей стороны. В этом случае из множества строк с одинаковым значением ключей `JOIN` остается только одна (не уточняется какая именно – отсюда и название `ANY`).
+Данный синтаксис отличается от принятого в [ClickHouse]{% if lang == "en" %}(https://clickhouse.com/docs/en/sql-reference/statements/select/join/){% endif %}{% if lang == "ru" %}(https://clickhouse.tech/docs/ru/sql-reference/statements/select/join/){% endif %}, где `ANY` пишется перед типом `JOIN` и работает только для правой стороны.
+
+Запрос
+
+```yql
+$t1 = AsList(
+ AsStruct("1" AS key, "v111" AS value),
+ AsStruct("2" AS key, "v121" AS value),
+ AsStruct("2" AS key, "v122" AS value),
+ AsStruct("3" AS key, "v131" AS value),
+ AsStruct("3" AS key, "v132" AS value));
+
+$t2 = AsList(
+ AsStruct("2" AS key, "v221" AS value),
+ AsStruct("2" AS key, "v222" AS value),
+ AsStruct("3" AS key, "v231" AS value),
+ AsStruct("3" AS key, "v232" AS value),
+ AsStruct("4" AS key, "v241" AS value));
+
+SELECT
+ a.key, a.value, b.value
+FROM ANY AS_TABLE($t1) AS a
+JOIN ANY AS_TABLE($t2) AS b
+ON a.key == b.key;
+```
+
+выдаст:
+
+|a.key|a.value|b.value|
+| --- | --- | --- |
+|"3"|"v131"|"v231"|
+|"2"|"v121"|"v221"|
+
+а без `ANY` выдал бы:
+
+|a.key|a.value|b.value|
+| --- | --- | --- |
+|"3"|"v131"|"v231"|
+|"3"|"v131"|"v232"|
+|"3"|"v132"|"v231"|
+|"3"|"v132"|"v232"|
+|"2"|"v121"|"v221"|
+|"2"|"v121"|"v222"|
+|"2"|"v122"|"v221"|
+|"2"|"v122"|"v222"|
+
+{% endif %}
+
+
diff --git a/ydb/docs/ru/core/yql/reference/syntax/select/order_by.md b/ydb/docs/ru/core/yql/reference/syntax/select/order_by.md
index 42405409d82..33529bbb3ba 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/select/order_by.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/select/order_by.md
@@ -19,6 +19,6 @@ ORDER BY key DESC, LENGTH(string_column) ASC;
{% if feature_window_functions %}
-Ключевое слово `ORDER BY` также может использоваться в механизме [оконных функций](../window.md).
+Ключевое слово `ORDER BY` также может использоваться в механизме [оконных функций](window.md).
{% endif %}
diff --git a/ydb/docs/ru/core/yql/reference/syntax/select/secondary_index.md b/ydb/docs/ru/core/yql/reference/syntax/select/secondary_index.md
index d41b23a61e1..61b39b68a8d 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/select/secondary_index.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/select/secondary_index.md
@@ -24,7 +24,7 @@ SELECT series_id, title, info, release_date, views, uploaded_user_id
WHERE views >= someValue
```
-Сделать [`JOIN`](../join.md) строковых таблиц `series` и `users` c заданным полем `userName` по индексам `users_index` и `name_index` соответственно:
+Сделать [`JOIN`](join.md) строковых таблиц `series` и `users` c заданным полем `userName` по индексам `users_index` и `name_index` соответственно:
```yql
SELECT t1.series_id, t1.title
diff --git a/ydb/docs/ru/core/yql/reference/syntax/select/toc_i.yaml b/ydb/docs/ru/core/yql/reference/syntax/select/toc_i.yaml
index 675b5617e23..b91b1795007 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/select/toc_i.yaml
+++ b/ydb/docs/ru/core/yql/reference/syntax/select/toc_i.yaml
@@ -5,7 +5,11 @@ items:
- { name: FROM AS_TABLE, href: from_as_table.md }
- { name: FROM SELECT, href: from_select.md }
- { name: FOLDER, href: folder.md, when: yt }
+- { name: FLATTEN, href: flatten.md }
+- { name: GROUP BY, href: group-by.md }
+- { name: JOIN, href: join.md, when: feature_join }
- { name: WalkFolders, href: walk_folders.md, when: yt }
+- { name: WINDOW, href: window.md, when: feature_window_functions }
- { name: DISTINCT, href: distinct.md }
- { name: UNIQUE DISTINCT, href: unique_distinct_hints.md }
- { name: UNION, href: union.md }
diff --git a/ydb/docs/ru/core/yql/reference/syntax/window.md b/ydb/docs/ru/core/yql/reference/syntax/select/window.md
index b3d80305b14..8208b0ac6e8 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/window.md
+++ b/ydb/docs/ru/core/yql/reference/syntax/select/window.md
@@ -2,9 +2,9 @@
Механизм оконных функций, появившийся в стандарте SQL:2003 и расширенный в стандарте SQL:2011, позволяет выполнять вычисления над набором строк таблицы, который некоторым образом соотносится с текущей строкой.
-В отличие от [агрегатных функций](../builtins/aggregation.md) при этом не происходит группировка нескольких строк в одну – после применения оконных функций число строк в результирующей таблице всегда совпадает с числом строк в исходной.
+В отличие от [агрегатных функций](../../builtins/aggregation.md), при этом не происходит группировка нескольких строк в одну: после применения оконных функций число строк в результирующей таблице всегда совпадает с числом строк в исходной.
-При наличии в запросе агрегатных и оконных функций сначала производится группировка и вычисляются значения агрегатных функций. Вычисленные значения агрегатных функций могут использоваться в качестве аргументов оконных (но не наоборот). Порядок, в котором вычисляются оконные функции относительно других элементов запроса, описан в разеделе [SELECT](select/index.md).
+При наличии в запросе одновременно агрегатных и оконных функций сначала производится группировка и вычисляются значения агрегатных функций. Вычисленные значения агрегатных функций могут использоваться в качестве аргументов оконных (но не наоборот). Порядок, в котором вычисляются оконные функции относительно других элементов запроса, описан в разеделе [SELECT](index.md).
## Синтаксис {#syntax}
@@ -69,7 +69,7 @@ WINDOW
Указание `PARTITION BY` группирует строки исходной таблицы в *разделы*, которые затем обрабатываются независимо друг от друга.
Если `PARTITION BY` не указан, то все строки исходной таблицы попадают в один раздел. Указание `ORDER BY` определяет порядок строк в разделе.
-В `PARTITION BY`, как и в [GROUP BY](group_by.md) можно использовать алиасы и [SessionWindow](group_by.md#session-window).
+В `PARTITION BY`, как и в [GROUP BY](group-by.md) можно использовать алиасы и [SessionWindow](group-by.md#session-window).
При отсутствии `ORDER BY` порядок строк в разделе не определен.
@@ -88,7 +88,7 @@ WINDOW
Далее, в зависимости от конкретной оконной функции производится ее вычисление либо на множестве строк раздела, либо на множестве строк рамки окна.
-[Список доступных оконных функций](../builtins/window.md)
+[Список доступных оконных функций](../../builtins/window.md)
### Примеры
@@ -141,7 +141,7 @@ WINDOW w AS (
* Функции, вычисляемые на рамке окна `ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING` либо `ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`, реализованы эффективно (не требуют дополнительной памяти и вычисляются на разделе за O(размер раздела)).
-* Для рамки окна `ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING` есть возможность выбрать стратегию выполнения в оперативной памяти, указав [хинт](lexer.md#sql-hints) `COMPACT` после ключевого слова `PARTITION`.
+* Для рамки окна `ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING` есть возможность выбрать стратегию выполнения в оперативной памяти, указав [хинт](../lexer.md#sql-hints) `COMPACT` после ключевого слова `PARTITION`.
Например: `PARTITION /*+ COMPACT() */ BY key` или `PARTITION /*+ COMPACT() */ BY ()` (в случае если `PARTITION BY` изначально отсутствовал).
diff --git a/ydb/docs/ru/core/yql/reference/syntax/toc_i.yaml b/ydb/docs/ru/core/yql/reference/syntax/toc_i.yaml
index 911e1b304f4..178e59ac524 100644
--- a/ydb/docs/ru/core/yql/reference/syntax/toc_i.yaml
+++ b/ydb/docs/ru/core/yql/reference/syntax/toc_i.yaml
@@ -41,12 +41,9 @@ items:
- { name: DROP TOPIC, href: drop-topic.md, when: feature_topic_control_plane }
- { name: DROP USER, href: drop-user.md, when: feature_user_and_group }
- { name: GRANT, href: grant.md, when: feature_user_and_group }
-- { name: GROUP BY, href: group_by.md }
- { name: EXPORT и IMPORT, href: export_import.md, when: feature_mapreduce }
-- { name: FLATTEN, href: flatten.md }
- { name: INSERT, href: insert_into.md }
- { name: INTO RESULT, href: into_result.md }
-- { name: JOIN, href: join.md, when: feature_join }
- { name: PRAGMA, href: pragma.md }
- { name: PROCESS STREAM, href: process.md, when: feature_mapreduce and process_command == "PROCESS STREAM" }
- { name: PROCESS, href: process.md, when: feature_mapreduce and process_command == "PROCESS" }
@@ -61,5 +58,4 @@ items:
- { name: UPSERT OBJECT TYPE SECRET, href: upsert-object-type-secret.md, when: feature_federated_queries}
- { name: USE, href: use.md, when: feature_mapreduce }
- { name: VALUES, href: values.md }
-- { name: WINDOW, href: window.md, when: feature_window_functions }
- { name: Неподдерживаемые конструкции, href: not_yet_supported.md }