繁体   English   中英

不支持 sql 查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM