[英]sql query not supported
桌子:
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 不支持相关子查询,这有一些现在并不重要的原因。 问题是您需要重写查询。 乍一看,这在这种情况下看起来很简单。
关键是将其更改为用 JOIN ON 子句替换此子句“WHERE T2.first_col=T1.first_col”的连接。 这是此重写中未经测试的剪辑,以演示其外观(您的确切情况可以对此进行调整):
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;
但是,在任何数据库中,我建议使用 window 函数执行此操作:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.