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

詳細情報は以下の各リンクをご参照ください。

  1. WITH 句

  2. SELECT リスト

  3. FROM 句

  4. WHERE 句

  5. CONNECT BY 句

  6. GROUP BY 句

  7. HAVING 句

  8. QUALIFY 句

  9. UNION、 INTERSECT、および EXCEPT

  10. ORDER BY 句

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
Copy

サンプルソースパターン

入力コード:

 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';
Copy

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');
Copy

COUNT(*)

12

既知の問題はありません。

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

サンプルソースパターン

結合タイプ

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;
Copy
内部結合
EMPLOYEE_NAMEDEPARTMENT_NAME
JohnHR
JorgeSales
KwakuSales
LiuSales
MateoEngineering
NikkiMarketing
PauloMarketing
RichardMarketing
SofíaEngineering
左結合

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;
Copy
内部結合

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;
Copy

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;
Copy

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)
);
Copy

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)
);
Copy

COLOR

CNT

RED

15

GREEN

20

BLUE

7

RED

35

BLUE

40

RED

10

GREEN

23

関連 EWIs

  1. SSC-EWI-RS0005: Snowflakeの PIVOT/UNPIVOT クエリの IN 句で列エイリアスを使用することはできません。

GROUP BY 句

説明

GROUP BY 句は、クエリのグループ化列を識別します。グループ化列は、クエリが SUMAVGCOUNT のような標準関数で集約を計算する時に宣言されなければなりません。(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 [, ...] )
    }
Copy

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;
Copy

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;
Copy

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;
Copy

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;
Copy

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;
Copy

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;
Copy

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

サンプルソースパターン

入力コード:

 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;
Copy

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;
Copy

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

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;
Copy

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;
Copy

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
Copy

サンプルソースパターン

入力コード:

 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;
Copy

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;
Copy

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では、 DISTINCTALL オプションはクエリの先頭に記述する必要があることに注意してください。

注釈

Redshiftでは、アプリケーションで外部キーや無効な主キーを許可すると、クエリが不正な結果を返すことがあります。例えば、 SELECT DISTINCT クエリは、主キー列が全ての一意な値を含んでいない場合、重複行を返す可能性があります。(Redshift SQL 言語リファレンス SELECT リスト)

文法構文

 SELECT
[ TOP number ]
[ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]
Copy

サンプルソースパターン

トップ句

入力コード:
 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;
Copy

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;
Copy

ID

NAME

MANAGER_ID

100

カルロス

null

101

John

100

102

ホルヘ

101

103

クワク

101

110

リュウ

101

ALL

入力コード:
SELECT ALL manager_id
FROM employee;
Copy

MANAGER_ID

null

100

101

101

101

102

103

103

103

104

104

102

104

出力コード:
 SELECT ALL manager_id
FROM
    employee;
Copy

MANAGER_ID

null

100

101

101

101

102

103

103

103

104

104

102

104

DISTINCT

入力コード:
SELECT DISTINCT manager_id
FROM employee;
Copy

MANAGER_ID

null

100

101

102

103

104

出力コード:
SELECT DISTINCT manager_id
FROM 
    employee;
Copy

MANAGER_ID

null

100

101

102

103

104

関連 EWIs

既知の問題はありません。

UNION、 INTERSECT、および EXCEPT

説明

UNIONINTERSECTEXCEPT セット演算子 は、2つの別々のクエリ式の結果を比較し、マージするために使用されます。(Redshift SQL 言語リファレンスセット演算子)

Snowflakeでは、 セット演算子 が完全にサポートされています。

Grammar Syntax

 query
{ UNION [ ALL ] | INTERSECT | EXCEPT | MINUS }
query
Copy

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;
Copy

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;
Copy

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

サンプルソースパターン

入力コード:

 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%';
Copy

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 '\\';
Copy

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 )
Copy

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;
Copy

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;
Copy

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;
Copy

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;
Copy

EMPLOYEE

MANAGER

John

カルロス

ホルヘ

John

クワク

John

リュウ

John

マテオ

ホルヘ

ソフィア

ホルヘ

ニッキー

クワク

パウロ

クワク

リチャード

クワク

サーンヴィ

パウロ

シャーリー

パウロ

チョウ

パウロ

カルロス

null

Related EWIs

既知の問題はありません。