SnowConvert: Redshift SELECT ステートメント¶
SELECT¶
説明¶
テーブル、ビュー、ユーザー定義関数から行を返します。(Redshift SQL 言語リファレンス SELECT ステートメント)
文法構文¶
[ WITH with_subquery [, ...] ]
SELECT
[ TOP number | [ ALL | DISTINCT ]
* | expression [ AS output_name ] [, ...] ]
[ FROM table_reference [, ...] ]
[ WHERE condition ]
[ [ START WITH expression ] CONNECT BY expression ]
[ GROUP BY expression [, ...] ]
[ HAVING condition ]
[ QUALIFY condition ]
[ { UNION | ALL | INTERSECT | EXCEPT | MINUS } query ]
[ ORDER BY expression [ ASC | DESC ] ]
[ LIMIT { number | ALL } ]
[ OFFSET start ]
詳細情報は以下の各リンクをご参照ください。
CONNECT BY 句¶
説明¶
CONNECT BY
句は、階層内の行の関係を指定します。CONNECT BY
を使用すると、テーブルを自身に結合して階層データを処理することで、階層順に行を選択することができます。(Redshift SQL 言語リファレンス CONNECT BY 句)
Snowflakeでは、 CONNECT BY 句 がサポートされています。
Grammar Syntax
[START WITH start_with_conditions]
CONNECT BY connect_by_conditions
サンプルソースパターン
入力コード:
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
);
INSERT INTO employee(id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
SELECT COUNT(*)
FROM
Employee "start"
CONNECT BY PRIOR id = manager_id
START WITH name = 'John';
COUNT(*) |
---|
12 |
出力コード:
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO employee (id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
SELECT COUNT(*)
FROM
Employee "start"
CONNECT BY PRIOR id = manager_id
START WITH RTRIM( name) = RTRIM( 'John');
COUNT(*) |
---|
12 |
関連 EWIs
既知の問題はありません。
FROM 句
Description
クエリの FROM
句は、データを選択するテーブル参照(テーブル、ビュー、サブクエリ)をリストします。複数のテーブル参照がリストされている場合は、 FROM
句または WHERE
句で適切な構文を使用して、テーブルを結合する必要があります。結合条件が指定されていない場合、システムはクエリをクロス結合として処理します。(Redshift SQL 言語リファレンス FROM 句)
警告
FROM 句 はSnowflakeで部分的にサポートされています。 オブジェクトのピボット解除 は現在サポートされていません。
文法構文¶
FROM table_reference [, ...]
<table_reference> ::=
with_subquery_table_name [ table_alias ]
table_name [ * ] [ table_alias ]
( subquery ) [ table_alias ]
table_reference [ NATURAL ] join_type table_reference
[ ON join_condition | USING ( join_column [, ...] ) ]
table_reference PIVOT (
aggregate(expr) [ [ AS ] aggregate_alias ]
FOR column_name IN ( expression [ AS ] in_alias [, ...] )
) [ table_alias ]
table_reference UNPIVOT [ INCLUDE NULLS | EXCLUDE NULLS ] (
value_column_name
FOR name_column_name IN ( column_reference [ [ AS ]
in_alias ] [, ...] )
) [ table_alias ]
UNPIVOT expression AS value_alias [ AT attribute_alias ]
サンプルソースパターン¶
結合タイプ¶
Snowflakeはあらゆるタイプの結合をサポートしています。詳細情報については、 JOIN ドキュメントをご覧ください。
入力コード:¶
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
);
INSERT INTO employee(id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
CREATE TABLE department (
id INT,
name VARCHAR(50),
manager_id INT
);
INSERT INTO department(id, name, manager_id) VALUES
(1, 'HR', 100),
(2, 'Sales', 101),
(3, 'Engineering', 102),
(4, 'Marketing', 103);
SELECT e.name AS employee_name, d.name AS department_name
FROM employee e
INNER JOIN department d ON e.manager_id = d.manager_id;
SELECT e.name AS employee_name, d.name AS department_name
FROM employee e
LEFT JOIN department d ON e.manager_id = d.manager_id;
SELECT d.name AS department_name, e.name AS manager_name
FROM department d
RIGHT JOIN employee e ON d.manager_id = e.id;
SELECT e.name AS employee_name, d.name AS department_name
FROM employee e
FULL JOIN department d ON e.manager_id = d.manager_id;
内部結合¶
EMPLOYEE_NAME | DEPARTMENT_NAME |
---|---|
John | HR |
Jorge | Sales |
Kwaku | Sales |
Liu | Sales |
Mateo | Engineering |
Nikki | Marketing |
Paulo | Marketing |
Richard | Marketing |
Sofía | Engineering |
左結合¶
EMPLOYEE_NAME |
DEPARTMENT_NAME |
---|---|
カルロス |
null |
John |
HR |
ホルヘ |
販売 |
クワク |
販売 |
リュウ |
販売 |
マテオ |
エンジニアリング |
ニッキー |
マーケティング |
パウロ |
マーケティング |
リチャード |
マーケティング |
サーンヴィ |
null |
シャーリー |
null |
ソフィア |
エンジニアリング |
チョウ |
null |
右結合¶
DEPARTMENT_NAME |
MANAGER_NAME |
---|---|
HR |
カルロス |
販売 |
John |
エンジニアリング |
ホルヘ |
マーケティング |
クワク |
null |
リュウ |
null |
マテオ |
null |
ニッキー |
null |
パウロ |
null |
リチャード |
null |
サーンヴィ |
null |
シャーリー |
null |
ソフィア |
null |
チョウ |
完全結合¶
EMPLOYEE_NAME |
DEPARTMENT_NAME |
---|---|
カルロス |
null |
John |
HR |
ホルヘ |
販売 |
クワク |
販売 |
リュウ |
販売 |
マテオ |
エンジニアリング |
ニッキー |
マーケティング |
パウロ |
マーケティング |
リチャード |
マーケティング |
サーンヴィ |
null |
シャーリー |
null |
ソフィア |
エンジニアリング |
チョウ |
null |
出力コード:¶
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO employee (id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
CREATE TABLE department (
id INT,
name VARCHAR(50),
manager_id INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO department (id, name, manager_id) VALUES
(1, 'HR', 100),
(2, 'Sales', 101),
(3, 'Engineering', 102),
(4, 'Marketing', 103);
SELECT e.name AS employee_name, d.name AS department_name
FROM
employee e
INNER JOIN
department d ON e.manager_id = d.manager_id;
SELECT e.name AS employee_name, d.name AS department_name
FROM
employee e
LEFT JOIN
department d ON e.manager_id = d.manager_id;
SELECT d.name AS department_name, e.name AS manager_name
FROM
department d
RIGHT JOIN
employee e ON d.manager_id = e.id;
SELECT e.name AS employee_name, d.name AS department_name
FROM
employee e
FULL JOIN
department d ON e.manager_id = d.manager_id;
内部結合¶
EMPLOYEE_NAME |
DEPARTMENT_NAME |
---|---|
John |
HR |
ホルヘ |
販売 |
クワク |
販売 |
リュウ |
販売 |
マテオ |
エンジニアリング |
ニッキー |
マーケティング |
パウロ |
マーケティング |
リチャード |
マーケティング |
ソフィア |
エンジニアリング |
左結合¶
EMPLOYEE_NAME |
DEPARTMENT_NAME |
---|---|
カルロス |
null |
John |
HR |
ホルヘ |
販売 |
クワク |
販売 |
リュウ |
販売 |
マテオ |
エンジニアリング |
ニッキー |
マーケティング |
パウロ |
マーケティング |
リチャード |
マーケティング |
サーンヴィ |
null |
シャーリー |
null |
ソフィア |
エンジニアリング |
チョウ |
null |
右結合¶
DEPARTMENT_NAME |
MANAGER_NAME |
---|---|
HR |
カルロス |
販売 |
John |
エンジニアリング |
ホルヘ |
マーケティング |
クワク |
null |
リュウ |
null |
マテオ |
null |
ニッキー |
null |
パウロ |
null |
リチャード |
null |
サーンヴィ |
null |
シャーリー |
null |
ソフィア |
null |
チョウ |
完全結合¶
EMPLOYEE_NAME |
DEPARTMENT_NAME |
---|---|
カルロス |
null |
John |
HR |
ホルヘ |
販売 |
クワク |
販売 |
リュウ |
販売 |
マテオ |
エンジニアリング |
ニッキー |
マーケティング |
パウロ |
マーケティング |
リチャード |
マーケティング |
サーンヴィ |
null |
シャーリー |
null |
ソフィア |
エンジニアリング |
チョウ |
null |
ピボット句¶
注釈
Snowflakeの PIVOT クエリの IN 句で列エイリアスを使用することはできません。
入力コード:¶
SELECT *
FROM
(SELECT e.manager_id, d.name AS department, e.id AS employee_id
FROM employee e
JOIN department d ON e.manager_id = d.manager_id) AS SourceTable
PIVOT
(
COUNT(employee_id)
FOR department IN ('HR', 'Sales', 'Engineering', 'Marketing')
) AS PivotTable;
MANAGER_ID |
'HR' |
'販売' |
'エンジニアリング' |
'マーケティング' |
---|---|---|---|---|
100 |
1 |
0 |
0 |
0 |
101 |
0 |
3 |
0 |
0 |
102 |
0 |
0 |
2 |
0 |
103 |
0 |
0 |
0 |
3 |
出力コード:¶
SELECT *
FROM
(SELECT e.manager_id, d.name AS department, e.id AS employee_id
FROM
employee e
JOIN
department d ON e.manager_id = d.manager_id) AS SourceTable
PIVOT
(
COUNT(employee_id)
FOR department IN ('HR', 'Sales', 'Engineering', 'Marketing')
) AS PivotTable;
MANAGER_ID |
'HR' |
'販売' |
'エンジニアリング' |
'マーケティング' |
---|---|---|---|---|
100 |
1 |
0 |
0 |
0 |
101 |
0 |
3 |
0 |
0 |
102 |
0 |
0 |
2 |
0 |
103 |
0 |
0 |
0 |
3 |
アンピボット句¶
注釈
Snowflakeの UNPIVOT クエリの IN 句で列エイリアスを使用することはできません。
入力コード:¶
CREATE TABLE count_by_color (quality VARCHAR, red INT, green INT, blue INT);
INSERT INTO count_by_color VALUES ('high', 15, 20, 7);
INSERT INTO count_by_color VALUES ('normal', 35, NULL, 40);
INSERT INTO count_by_color VALUES ('low', 10, 23, NULL);
SELECT *
FROM (SELECT red, green, blue FROM count_by_color) UNPIVOT (
cnt FOR color IN (red, green, blue)
);
SELECT *
FROM (SELECT red, green, blue FROM count_by_color) UNPIVOT (
cnt FOR color IN (red r, green as g, blue)
);
COLOR |
CNT |
---|---|
RED |
15 |
RED |
35 |
RED |
10 |
GREEN |
20 |
GREEN |
23 |
BLUE |
7 |
BLUE |
40 |
出力コード:¶
CREATE TABLE count_by_color (quality VARCHAR, red INT, green INT, blue INT)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO count_by_color
VALUES ('high', 15, 20, 7);
INSERT INTO count_by_color
VALUES ('normal', 35, NULL, 40);
INSERT INTO count_by_color
VALUES ('low', 10, 23, NULL);
SELECT *
FROM (SELECT red, green, blue FROM
count_by_color
) UNPIVOT (
cnt FOR color IN (red, green, blue)
);
SELECT *
FROM (SELECT red, green, blue FROM
count_by_color
) UNPIVOT (
cnt FOR color IN (red
!!!RESOLVE EWI!!! /*** SSC-EWI-RS0005 - COLUMN ALIASES CANNOT BE USED IN THE IN CLAUSE OF THE PIVOT/UNPIVOT QUERY IN SNOWFLAKE. ***/!!!
r, green
!!!RESOLVE EWI!!! /*** SSC-EWI-RS0005 - COLUMN ALIASES CANNOT BE USED IN THE IN CLAUSE OF THE PIVOT/UNPIVOT QUERY IN SNOWFLAKE. ***/!!!
as g, blue)
);
COLOR |
CNT |
---|---|
RED |
15 |
GREEN |
20 |
BLUE |
7 |
RED |
35 |
BLUE |
40 |
RED |
10 |
GREEN |
23 |
関連 EWIs¶
SSC-EWI-RS0005: Snowflakeの PIVOT/UNPIVOT クエリの IN 句で列エイリアスを使用することはできません。
GROUP BY 句¶
説明¶
GROUP BY
句は、クエリのグループ化列を識別します。グループ化列は、クエリが SUM
、 AVG
、 COUNT
のような標準関数で集約を計算する時に宣言されなければなりません。(Redshift SQL 言語リファレンス GROUP BY 句)
GROUP BY 句 はSnowflakeで完全にサポートされています。
Grammar Syntax
GROUP BY group_by_clause [, ...]
group_by_clause := {
expr |
GROUPING SETS ( () | group_by_clause [, ...] ) |
ROLLUP ( expr [, ...] ) |
CUBE ( expr [, ...] )
}
Sample Source Patterns
グループ化セット
Input Code:
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
);
INSERT INTO employee(id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
SELECT
manager_id,
COUNT(id) AS total_employees
FROM employee
GROUP BY GROUPING SETS
((manager_id), ())
ORDER BY manager_id;
MANAGER_ID |
TOTAL_EMPLOYEES |
---|---|
100 |
1 |
101 |
3 |
102 |
2 |
103 |
3 |
104 |
3 |
null |
1 |
null |
13 |
Output Code:
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO employee (id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
SELECT
manager_id,
COUNT(id) AS total_employees
FROM
employee
GROUP BY GROUPING SETS
((manager_id), ())
ORDER BY manager_id;
MANAGER_ID |
TOTAL_EMPLOYEES |
---|---|
100 |
1 |
101 |
3 |
102 |
2 |
103 |
3 |
104 |
3 |
null |
1 |
null |
13 |
キューブごとにグループ化
Input Code:
SELECT
manager_id,
COUNT(id) AS total_employees
FROM
employee
GROUP BY CUBE(manager_id)
ORDER BY manager_id;
MANAGER_ID |
TOTAL_EMPLOYEES |
---|---|
100 |
1 |
101 |
3 |
102 |
2 |
103 |
3 |
104 |
3 |
null |
1 |
null |
13 |
Output Code:
SELECT
manager_id,
COUNT(id) AS total_employees
FROM
employee
GROUP BY CUBE(manager_id)
ORDER BY manager_id;
MANAGER_ID |
TOTAL_EMPLOYEES |
---|---|
100 |
1 |
101 |
3 |
102 |
2 |
103 |
3 |
104 |
3 |
null |
1 |
null |
13 |
ロールアップごとにグループ化
Input Code:
SELECT
manager_id,
COUNT(id) AS total_employees
FROM
employee
GROUP BY ROLLUP(manager_id)
ORDER BY manager_id;
MANAGER_ID |
TOTAL_EMPLOYEES |
---|---|
100 |
1 |
101 |
3 |
102 |
2 |
103 |
3 |
104 |
3 |
null |
1 |
null |
13 |
Output Code:
SELECT
manager_id,
COUNT(id) AS total_employees
FROM
employee
GROUP BY ROLLUP(manager_id)
ORDER BY manager_id;
MANAGER_ID |
TOTAL_EMPLOYEES |
---|---|
100 |
1 |
101 |
3 |
102 |
2 |
103 |
3 |
104 |
3 |
null |
1 |
null |
13 |
Related EWIs
既知の問題はありません。
HAVING 句
Description
HAVING
句は、クエリが返す中間グループ化結果セットに条件を適用します。(Redshift SQL 言語リファレンス HAVING 句)
Snowflakeでは、 HAVING 句 が完全にサポートされています。
文法構文¶
[ HAVING condition ]
サンプルソースパターン¶
入力コード:¶
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
);
INSERT INTO employee(id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
SELECT manager_id, COUNT(id) AS total_employees
FROM
employee
GROUP BY manager_id
HAVING COUNT(id) > 2
ORDER BY manager_id;
MANAGER_ID |
TOTAL_EMPLOYEES |
---|---|
101 |
3 |
103 |
3 |
104 |
3 |
出力コード:¶
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO employee (id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
SELECT manager_id, COUNT(id) AS total_employees
FROM
employee
GROUP BY manager_id
HAVING COUNT(id) > 2
ORDER BY manager_id;
MANAGER_ID |
TOTAL_EMPLOYEES |
---|---|
101 |
3 |
103 |
3 |
104 |
3 |
関連 EWIs¶
既知の問題はありません。
ORDER BY 句¶
説明¶
ORDER BY
句はクエリの結果セットをソートします。(Redshift SQL 言語リファレンスOrder By句)
Snowflakeでは、 ORDER BY 句 が完全にサポートされています。
Grammar Syntax
[ ORDER BY expression [ ASC | DESC ] ]
[ NULLS FIRST | NULLS LAST ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
Sample Source Patterns
Input Code:
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT,
salary DECIMAL(10, 2)
);
INSERT INTO employee (id, name, manager_id, salary) VALUES
(100, 'Carlos', NULL, 120000.00),
(101, 'John', 100, 90000.00),
(102, 'Jorge', 101, 95000.00),
(103, 'Kwaku', 101, 105000.00),
(104, 'Paulo', 102, 110000.00),
(105, 'Richard', 102, 85000.00),
(106, 'Mateo', 103, 95000.00),
(107, 'Liu', 103, 108000.00),
(108, 'Zhang', 104, 95000.00);
SELECT id, name, manager_id, salary
FROM employee
ORDER BY salary DESC NULLS LAST, name ASC NULLS FIRST
LIMIT 5
OFFSET 2;
ID |
NAME |
MANAGER_ID |
SALARY |
---|---|---|---|
107 |
リュウ |
103 |
108000.00 |
103 |
クワク |
101 |
105000.00 |
102 |
ホルヘ |
101 |
95000.00 |
106 |
マテオ |
103 |
95000.00 |
108 |
チョウ |
104 |
95000.00 |
Output Code:
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT,
salary DECIMAL(10, 2)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO employee (id, name, manager_id, salary) VALUES
(100, 'Carlos', NULL, 120000.00),
(101, 'John', 100, 90000.00),
(102, 'Jorge', 101, 95000.00),
(103, 'Kwaku', 101, 105000.00),
(104, 'Paulo', 102, 110000.00),
(105, 'Richard', 102, 85000.00),
(106, 'Mateo', 103, 95000.00),
(107, 'Liu', 103, 108000.00),
(108, 'Zhang', 104, 95000.00);
SELECT id, name, manager_id, salary
FROM
employee
ORDER BY salary DESC NULLS LAST, name ASC NULLS FIRST
LIMIT 5
OFFSET 2;
ID |
NAME |
MANAGER_ID |
SALARY |
---|---|---|---|
107 |
リュウ |
103 |
108000.00 |
103 |
クワク |
101 |
105000.00 |
102 |
ホルヘ |
101 |
95000.00 |
106 |
マテオ |
103 |
95000.00 |
108 |
チョウ |
104 |
95000.00 |
Related EWIs
既知の問題はありません。
QUALIFY 句
Description
QUALIFY
句は、ユーザーが指定した検索条件に従って、以前に計算されたウィンドウ関数の結果をフィルターします。句を使用すると、サブクエリを使用せずにウィンドウ関数の結果にフィルター条件を適用できます。(Redshift SQL 言語リファレンス QUALIFY 句)
Snowflakeでは、 QUALIFY 句 がサポートされています。
文法構文¶
QUALIFY condition
サンプルソースパターン¶
入力コード:¶
CREATE TABLE store_sales
(
ss_sold_date DATE,
ss_sold_time TIME,
ss_item TEXT,
ss_sales_price FLOAT
);
INSERT INTO store_sales VALUES ('2022-01-01', '09:00:00', 'Product 1', 100.0),
('2022-01-01', '11:00:00', 'Product 2', 500.0),
('2022-01-01', '15:00:00', 'Product 3', 20.0),
('2022-01-01', '17:00:00', 'Product 4', 1000.0),
('2022-01-01', '18:00:00', 'Product 5', 30.0),
('2022-01-02', '10:00:00', 'Product 6', 5000.0),
('2022-01-02', '16:00:00', 'Product 7', 5.0);
SELECT *
FROM store_sales ss
WHERE ss_sold_time > time '12:00:00'
QUALIFY row_number()
OVER (PARTITION BY ss_sold_date ORDER BY ss_sales_price DESC) <= 2;
SS_SOLD_DATE |
SS_SOLD_TIME |
SS_ITEM |
SS_SALES_PRICE |
---|---|---|---|
2022-01-01 |
17:00:00 |
製品4 |
1000 |
2022-01-01 |
18:00:00 |
製品5 |
30 |
2022-01-02 |
16:00:00 |
製品7 |
5 |
出力コード:¶
CREATE TABLE store_sales
(
ss_sold_date DATE,
ss_sold_time TIME,
ss_item TEXT,
ss_sales_price FLOAT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO store_sales
VALUES ('2022-01-01', '09:00:00', 'Product 1', 100.0),
('2022-01-01', '11:00:00', 'Product 2', 500.0),
('2022-01-01', '15:00:00', 'Product 3', 20.0),
('2022-01-01', '17:00:00', 'Product 4', 1000.0),
('2022-01-01', '18:00:00', 'Product 5', 30.0),
('2022-01-02', '10:00:00', 'Product 6', 5000.0),
('2022-01-02', '16:00:00', 'Product 7', 5.0);
SELECT *
FROM
store_sales ss
WHERE ss_sold_time > time '12:00:00'
QUALIFY row_number()
OVER (PARTITION BY ss_sold_date ORDER BY ss_sales_price DESC) <= 2;
SS_SOLD_DATE |
SS_SOLD_TIME |
SS_ITEM |
SS_SALES_PRICE |
---|---|---|---|
2022-01-02 |
16:00:00 |
製品7 |
5 |
2022-01-01 |
17:00:00 |
製品4 |
1000 |
2022-01-01 |
18:00:00 |
製品5 |
30 |
関連 EWIs¶
既知の問題はありません。
SELECT リスト¶
説明¶
SELECT リストには、クエリで返したい列、関数、式を指定します。リストはクエリの出力を表します。(Redshift SQL 言語リファレンス SELECT リスト)
クエリ開始オプション はSnowflakeで完全にサポートされています。Snowflakeでは、 DISTINCT
と ALL
オプションはクエリの先頭に記述する必要があることに注意してください。
注釈
Redshiftでは、アプリケーションで外部キーや無効な主キーを許可すると、クエリが不正な結果を返すことがあります。例えば、 SELECT DISTINCT クエリは、主キー列が全ての一意な値を含んでいない場合、重複行を返す可能性があります。(Redshift SQL 言語リファレンス SELECT リスト)
文法構文¶
SELECT
[ TOP number ]
[ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]
サンプルソースパターン¶
トップ句¶
入力コード:¶
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
);
INSERT INTO employee(id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
SELECT TOP 5 id, name, manager_id
FROM employee;
ID |
NAME |
MANAGER_ID |
---|---|---|
100 |
カルロス |
null |
101 |
John |
100 |
102 |
ホルヘ |
101 |
103 |
クワク |
101 |
110 |
リュウ |
101 |
出力コード:¶
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO employee (id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
SELECT TOP 5 id, name, manager_id
FROM
employee;
ID |
NAME |
MANAGER_ID |
---|---|---|
100 |
カルロス |
null |
101 |
John |
100 |
102 |
ホルヘ |
101 |
103 |
クワク |
101 |
110 |
リュウ |
101 |
ALL¶
入力コード:¶
SELECT ALL manager_id
FROM employee;
MANAGER_ID |
---|
null |
100 |
101 |
101 |
101 |
102 |
103 |
103 |
103 |
104 |
104 |
102 |
104 |
出力コード:¶
SELECT ALL manager_id
FROM
employee;
MANAGER_ID |
---|
null |
100 |
101 |
101 |
101 |
102 |
103 |
103 |
103 |
104 |
104 |
102 |
104 |
DISTINCT¶
入力コード:¶
SELECT DISTINCT manager_id
FROM employee;
MANAGER_ID |
---|
null |
100 |
101 |
102 |
103 |
104 |
出力コード:¶
SELECT DISTINCT manager_id
FROM
employee;
MANAGER_ID |
---|
null |
100 |
101 |
102 |
103 |
104 |
関連 EWIs¶
既知の問題はありません。
UNION、 INTERSECT、および EXCEPT¶
説明¶
UNION
、 INTERSECT
、 EXCEPT
セット演算子 は、2つの別々のクエリ式の結果を比較し、マージするために使用されます。(Redshift SQL 言語リファレンスセット演算子)
Snowflakeでは、 セット演算子 が完全にサポートされています。
Grammar Syntax
query
{ UNION [ ALL ] | INTERSECT | EXCEPT | MINUS }
query
Sample Source Patterns
Input Code:
SELECT id, name, manager_id
FROM
employee
WHERE manager_id = 101
UNION
SELECT id, name, manager_id
FROM
employee
WHERE manager_id = 102
UNION ALL
SELECT id, name, manager_id
FROM
employee
WHERE manager_id = 101
INTERSECT
SELECT id, name, manager_id
FROM
employee
WHERE manager_id = 103
EXCEPT
SELECT id, name, manager_id
FROM
employee
WHERE manager_id = 104;
ID |
NAME |
MANAGER_ID |
---|---|---|
103 |
クワク |
101 |
110 |
リュウ |
101 |
102 |
ホルヘ |
101 |
106 |
マテオ |
102 |
201 |
ソフィア |
102 |
Output Code:
SELECT id, name, manager_id
FROM
employee
WHERE manager_id = 101
UNION
SELECT id, name, manager_id
FROM
employee
WHERE manager_id = 102
UNION ALL
SELECT id, name, manager_id
FROM
employee
WHERE manager_id = 101
INTERSECT
SELECT id, name, manager_id
FROM
employee
WHERE manager_id = 103
EXCEPT
SELECT id, name, manager_id
FROM
employee
WHERE manager_id = 104;
ID |
NAME |
MANAGER_ID |
---|---|---|
102 |
ホルヘ |
101 |
103 |
クワク |
101 |
110 |
リュウ |
101 |
106 |
マテオ |
102 |
201 |
ソフィア |
102 |
Related EWIs
既知の問題はありません。
WHERE 句
Description
WHERE
句には、テーブルを結合するか、テーブルの列に述語を適用する条件が含まれます。(Redshift SQL 言語リファレンス WHERE 句)
WHERE 句 はSnowflakeで完全にサポートされています。
文法構文¶
[ WHERE condition ]
サンプルソースパターン¶
入力コード:¶
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
);
INSERT INTO employee(id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
SELECT id, name, manager_id
FROM employee
WHERE name LIKE 'J%';
ID |
NAME |
MANAGER_ID |
---|---|---|
101 |
John |
100 |
102 |
ホルヘ |
101 |
出力コード:¶
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO employee (id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
SELECT id, name, manager_id
FROM
employee
WHERE name LIKE 'J%' ESCAPE '\\';
ID |
NAME |
MANAGER_ID |
---|---|---|
101 |
John |
100 |
102 |
ホルヘ |
101 |
関連 EWIs¶
既知の問題はありません。
WITH 句¶
説明¶
WITH
句は、クエリの SELECT リストの前に置かれるオプションの句です。WITH
句は、1つ以上の common_table_expressions を定義します。各共通テーブル式(CTE)は、ビュー定義に似た仮テーブルを定義します。これらの仮テーブルは FROM
句で参照できます。(Redshift SQL 言語リファレンス WITH 句)
Snowflakeでは、 WITH 句 が完全にサポートされています。
Grammar Syntax
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
--Where common_table_expression can be either non-recursive or recursive.
--Following is the non-recursive form:
CTE_table_name [ ( column_name [, ...] ) ] AS ( query )
--Following is the recursive form of common_table_expression:
CTE_table_name (column_name [, ...] ) AS ( recursive_query )
Sample Source Patterns
再帰形式
Input Code:
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
);
INSERT INTO employee(id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
WITH RECURSIVE john_org(id, name, manager_id, level) AS
( SELECT id, name, manager_id, 1 AS level
FROM employee
WHERE name = 'John'
UNION ALL
SELECT e.id, e.name, e.manager_id, level + 1 AS next_level
FROM employee e, john_org j
WHERE e.manager_id = j.id and level < 4
)
SELECT DISTINCT id, name, manager_id FROM john_org ORDER BY manager_id;
ID |
NAME |
MANAGER_ID |
---|---|---|
101 |
John |
100 |
110 |
リュウ |
101 |
102 |
ホルヘ |
101 |
103 |
クワク |
101 |
201 |
ソフィア |
102 |
106 |
マテオ |
102 |
105 |
リチャード |
103 |
104 |
パウロ |
103 |
110 |
ニッキー |
103 |
205 |
チョウ |
104 |
120 |
サーンヴィ |
104 |
200 |
シャーリー |
104 |
Output Code:
CREATE TABLE employee (
id INT,
name VARCHAR(20),
manager_id INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "11/05/2024", "domain": "test" }}';
INSERT INTO employee (id, name, manager_id) VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
WITH RECURSIVE john_org(id, name, manager_id, level) AS
( SELECT id, name, manager_id, 1 AS level
FROM
employee
WHERE
RTRIM( name) = RTRIM( 'John')
UNION ALL
SELECT e.id, e.name, e.manager_id, level + 1 AS next_level
FROM
employee e,
john_org j
WHERE e.manager_id = j.id and level < 4
)
SELECT DISTINCT id, name, manager_id FROM
john_org
ORDER BY manager_id;
ID |
NAME |
MANAGER_ID |
---|---|---|
101 |
John |
100 |
102 |
ホルヘ |
101 |
103 |
クワク |
101 |
110 |
リュウ |
101 |
106 |
マテオ |
102 |
201 |
ソフィア |
102 |
110 |
ニッキー |
103 |
104 |
パウロ |
103 |
105 |
リチャード |
103 |
120 |
サーンヴィ |
104 |
200 |
シャーリー |
104 |
205 |
チョウ |
104 |
非再帰形式
Input Code:
WITH ManagerHierarchy AS (
SELECT id AS employee_id, name AS employee_name, manager_id
FROM employee
)
SELECT e.employee_name AS employee, m.employee_name AS manager
FROM ManagerHierarchy e
LEFT JOIN ManagerHierarchy m ON e.manager_id = m.employee_id;
EMPLOYEE |
MANAGER |
---|---|
カルロス |
null |
John |
カルロス |
ホルヘ |
John |
クワク |
John |
リュウ |
John |
マテオ |
ホルヘ |
ソフィア |
ホルヘ |
ニッキー |
クワク |
パウロ |
クワク |
リチャード |
クワク |
サーンヴィ |
パウロ |
シャーリー |
パウロ |
チョウ |
パウロ |
Output Code:
WITH ManagerHierarchy AS (
SELECT id AS employee_id, name AS employee_name, manager_id
FROM
employee
)
SELECT e.employee_name AS employee, m.employee_name AS manager
FROM
ManagerHierarchy e
LEFT JOIN
ManagerHierarchy m ON e.manager_id = m.employee_id;
EMPLOYEE |
MANAGER |
---|---|
John |
カルロス |
ホルヘ |
John |
クワク |
John |
リュウ |
John |
マテオ |
ホルヘ |
ソフィア |
ホルヘ |
ニッキー |
クワク |
パウロ |
クワク |
リチャード |
クワク |
サーンヴィ |
パウロ |
シャーリー |
パウロ |
チョウ |
パウロ |
カルロス |
null |
Related EWIs
既知の問題はありません。