更好的写作方式:SELECT * with COUNT> 1

时间:2017-10-13 23:15:41

标签: sql group-by count teradata

任何人都对如何更好地编写这段代码有任何想法?

SELECT Column_A, Column_B, Column_C, Column_D, Column_E
FROM TABLE_A
WHERE Column_A IN
 (
  SELECT Column_A
  FROM 
    (
     SELECT Column_A, COUNT(DISTINCT COLUMN_B) AS Column_B_Count
     FROM TABLE_A
     GROUP by Column_A
     HAVING Column_B_Count > 1
    ) AS A
 )
GROUP BY Column_A, Column_B, Column_C, Column_D, Column_E;

谢谢!

4 个答案:

答案 0 :(得分:0)

SELECT DISTINCT
    A.Column_A
    , A.Column_B
    , A.Column_C
    , A.Column_D
    , A.Column_E
FROM
    TABLE_A AS A
    JOIN
        (
            SELECT Column_A
            FROM TABLE_A
            GROUP by Column_A
            HAVING COUNT(DISTINCT COLUMN_B) > 1
        ) AS Column_B_Count
    ON A.Column_A = Column_B_Count.Column_A

答案 1 :(得分:0)

SELECT Distinct Column_A, 
       Column_B, 
       Column_C, 
       Column_D, 
       Column_E
FROM TABLE_A
WHERE Column_A IN 
    (
     SELECT Column_A
     FROM TABLE_A
     GROUP by Column_A
     HAVING COUNT(DISTINCT COLUMN_B) > 1
    ) 

答案 2 :(得分:0)

我会使用窗口函数。我想这就是你想要的:

select . . .
from (select a.*,
             min(column_b) over (partition by a) as min_b,
             max(column_b) over (partition by a) as max_b,
      from table_a a
     ) a
where min_b <> max_b;

如果此查询可能返回重复项,您可能仍需要select distinct

答案 3 :(得分:0)

SELECT DISTINCT -- same as the final GROUP BY of original query
   Column_A, Column_B, Column_C, Column_D, Column_E
FROM TABLE_A
  -- 
GROUP BY Column_A, Column_B, Column_C, Column_D, Column_E
QUALIFY -- emulating DISTINCT > 1, which is not allowed in Windowed Aggregates:
   MIN(COLUMN_B) OVER (PARTITION BY Column_A) 
<> MAX(COLUMN_B) OVER (PARTITION BY Column_A) 

根据实际数据,即每个组的重复数量较少,删除GROUP BY可能更有效。

相关问题