不支持sql查询



表:

first_col         second_col
78                 g1
79                 g2
754                g1
34                 g2
67                 g1

执行此查询时:

SELECT T1.* ,CASE WHEN EXISTS (SELECT 'X' FROM Tab1 T2 WHERE T2.first_col=T1.first_col GROUP BY 
second_col) THEN 'include' ELSE 'exclude'  END new_col FROM Tab1 T1;

但不支持此子查询

谢谢!

正如您所看到的,Redshift上不支持相关子查询,这其中有一些原因现在并不重要。问题是您需要重写查询。乍一看,在这种情况下,这看起来很直接。

关键是将其更改为一个连接来替换此子句";其中T2.first_col=T1.first_;使用JOIN ON子句。下面是一个未经测试的重写片段,以展示它的外观(您的确切情况可能会对此进行调整(:

SELECT T1.* ,
CASE WHEN T3.first_col is not NULL THEN 'include' ELSE 'exclude'  END new_col 
FROM Tab1 T1
LEFT JOIN (SELECT first_col 
FROM Tab1 T2 
GROUP BY second_col 
HAVING count(1)<3 ) T3
ON T3.first_col=T1.first_col
;

通过更改为左联接,我们仍然可以在first_col上测试T2和T1之间何时不匹配。希望这能让你开始。

您想知道是否有"第二列";出现少于3次以进行匹配";第一列";。要做到这一点,您可以使用LEFT JOIN,但如下所示:

SELECT T1.*,
COALESCE(tt1.new_col, 'exclude') as new_col
FROM Tab1 T1 LEFT JOIN
(SELECT 'include' as new_col
FROM (SELECT first_col, second_col, COUNT(*) as cnt
FROM Tab1 tt1
) tt1
HAVING MIN(cnt) < 3
) tt1;

然而,在任何数据库中,我都建议使用窗口函数:

select t1.*,
(case when min(cnt) over (partition by first_col)
then 'include' else 'exclude'
end) as new_col
from (select t1.*,
count(*) over (partition by first_col, second_col) as cnt
from tab1 t1
) t1;

最新更新