在雪花

时间:2021-05-11 18:37:30

标签: sql snowflake-cloud-data-platform snowflake-schema

我在雪花中工作,当我需要在最终结果集中使用独特的列时,我陷入了非常严重的困境。

例如,我有包含以下信息的表 A:

+---------+----------|
| user_id | product  |
+---------+----------|
| 1       | 1        |
| 1       | 2        |
| 2       | 1        |
| 2       | 2        |
| 3       | 2        |
+---------+----------|

表 B 包含以下信息:

+---------+---------- |
| user_id | Week      |
+---------+-----------|
| 1       | 2020-01-02|
| 1       | 2020-01-02|
| 2       | 2020-01-03|
| 2       | 2020-01-03|
| 3       | 2020-01-04|
+---------+-----------|

当我编写查询时

Select * from a join b on a.user_id =b.userid

我获得 user_id 两次,因为我使用的是“*”,但我只需要一次 User_Id,输出为:

+---------+----------|---------- |
| user_id | product  | Week      |
+---------+----------|-----------|
| 1       | 1        | 2020-01-02|
| 1       | 2        | 2020-01-02|
| 2       | 1        | 2020-01-03|
| 2       | 2        | 2020-01-03|
| 3       | 2        | 2020-01-04|
+---------+----------|-----------|

但我得到了这个:

+---------+----------|---------- |---------+
| user_id | product  | Week      | user_id |
+---------+----------|-----------|---------+
| 1       | 1        | 2020-01-02| 1       |
| 1       | 2        | 2020-01-02| 1       |
| 2       | 1        | 2020-01-03| 2       |
| 2       | 2        | 2020-01-03| 2       |
| 3       | 2        | 2020-01-04| 3       |
+---------+----------|-----------|---------+

以上只是示例,在实际情况中,我在表 A 中有 355 列,在表 B 中有 410 列,所以我做不到

Select a.column_name_1,a.column_name_2 ....a.column_name_355,b.column_name_1,a.column_name_2 ....a.column_name_355 
from table a join table b on a.uder_id = b.userid .

我已经试过了,但它不起作用:

set name = (select listagg(column_name,',') as name from (
select row_number() over(order by column_name) column_id,column_name  from information_schema.columns
where table_schema='DEV'
and table_name ='table_a'
and column_name!='WEEK')
);

select $name from 
"DEV_DB"."DEV"."table_a" a inner join
"DEV_DB"."DEV"."table_b" b on a.WEEK = b.WEEK

谁能帮帮我!!

3 个答案:

答案 0 :(得分:0)

这是你需要的,如果我理解正确

select t.user_id , product , Week  
from table1 
join ( select user_id , max(week) week
       from tableB
       group by user_id
) t
on t.user_id = table1.user_id

答案 1 :(得分:0)

使用 JOIN USING

<块引用>

JOIN

USING( <column_list> )

被连接的两个表之间的公共列列表;这些列用作连接列。每个被连接的表中的列必须具有相同的名称和含义。

要正确使用 USING 子句,投影列表(SELECT 关键字后的列和其他表达式的列表)应为“*”。 这允许服务器只返回一次 key_column,这是使用 USING 子句的标准方式。

CREATE TABLE tab1(user_id INT, product_id INT);
CREATE TABLE tab2(user_id INT, week INT);

-- output 4 columns
SELECT * FROM tab1 INNER JOIN tab2 ON tab1.user_id = tab2.user_id;
--USER_ID   PRODUCT_ID  USER_ID WEEK

-- output 3 columns
SELECT * FROM tab1 INNER JOIN tab2 USING(user_id);
-- USER_ID  PRODUCT_ID  WEEK

答案 2 :(得分:0)

您可以使用 INFORMATION_SCHEMA 视图来帮助构建您的查询,而不是为那么多列手动编写。

示例:

SELECT '"' || COLUMN_NAME || '" AS ' || '"TableA_' || COLUMN_NAME || '",'
FROM INFORMATION_SCHEMA."COLUMNS" 
WHERE TABLE_NAME = 'TableA'
ORDER BY ORDINAL_POSITION 

输出类似于:

"col1" as "TableA_col1",
"col2" as "TableA_col2",
etc..

然后只需将列列表包含在 SELECTFROM TableA 中,对 TableB 执行相同操作并添加您的 JOIN 条件。