【问题标题】:sql query not supported不支持sql查询
【发布时间】:2021-03-13 15:17:10
【问题描述】:

表:

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;

但是不支持这个子查询

谢谢!

【问题讨论】:

  • GROUP BY 和子查询很棘手。请说明您想要做什么。
  • first_col 在您的表中是唯一的吗?

标签: sql subquery


【解决方案1】:

如您所见,Redshift 不支持相关子查询,这是有原因的,现在并不重要。问题是您需要重写查询。乍一看,这在这种情况下看起来很简单。

关键是将其更改为将“WHERE T2.first_col=T1.first_col”子句替换为 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 之间不匹配时进行测试。希望这能让你开始。

【讨论】:

    【解决方案2】:

    您想知道 any “second cols”是否出现少于 3 次以匹配“first col”。为此,您可以使用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;
    

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 2021-12-16
      • 2023-02-09
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多