Oracle:如何在获取结果之前按特定列对记录进行分组

时间:2016-08-18 23:01:43

标签: amazon-redshift

我在Redshift中有一个表格如下:

col1 | col2 | col3 | col4 | col5 | col6
=======================================
123  | AB   | SSSS | TTTT | PQR  | XYZ
---------------------------------------
123  | AB   | SSTT | TSTS | PQR  | XYZ
---------------------------------------
123  | AB   | PQRS | WXYZ | PQR  | XYZ
---------------------------------------
123  | CD   | SSTT | TSTS | PQR  | XYZ
---------------------------------------
123  | CD   | PQRS | WXYZ | PQR  | XYZ
---------------------------------------
456  | AB   | GGGG | RRRR | OPQ  | RST
---------------------------------------
456  | AB   | SSTT | TSTS | PQR  | XYZ
---------------------------------------
456  | AB   | PQRS | WXYZ | PQR  | XYZ

我有另一张表也有类似的结构和数据。

从这些表中,我需要选择col3中没有'SSSS'的值和col4中的'TTTT'(已编辑其中一个表 。我还需要按col1和col2中的值对结果进行分组。

在这里,我希望我的查询返回:

123,CD
456,AB

我不希望123, AB出现在我的结果中,因为对应于123, AB的其中一行分别在col3和col4中有SSSS和TTTT。即,我想省略col3中有SSSSTTTT的项目,以及我正在查找的两个表格中的任何一个中的col4。

我非常擅长编写查询以从数据库中提取信息,所以请忍受我的无知。我被告知要探索GROUP BYORDER BY,但我不确定我是否理解他们的用法。

我的查询看起来像是:

SELECT * from table1 join table2 on
table1.col1 = table2.col1 AND
table1.col2 = table2.col2
WHERE
col3 NOT LIKE 'SSSS' AND
col4 NOT LIKE 'TTTT'
GROUP BY col1,col2

但是,此查询会引发错误:col5 must appear in the GROUP BY clause or be used in an aggregate function;

我不知道该怎么办。我很感激任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

您似乎也想要DISTINCT结果。在这种情况下,使用MINUS的解决方案可能与其他任何解决方案一样高效(并且,请记住,MINUS自动也意味着DISTINCT):

select col1, col2 from table_name             -- enter your column and table names here
minus
select col1, col2 from table_name where col3 = 'SSSS' and col4 = 'TTTT'
;

无需任何分组!

说到这里,这是一个使用GROUP BY的解决方案。请注意,HAVING条件使用了一个非平凡的聚合函数 - 它是一个COUNT(),但计算的是一个CASE来处理所需的内容。请注意,没有必要/必需 HAVING子句/条件中的聚合函数包含在SELECT列表中!

select   col1, col2
from     table_name
group by col1, col2
having count(case when col3 = 'SSSS' and col4 = 'TTTT' then 1 else null end) = 0
;

答案 1 :(得分:0)

您应该使用EXCEPT运算符。 EXCEPT and MINUS是同一运算符的两个不同版本。

以下是您的查询应该是什么样的语法

SELECT col1, col2 FROM table1           
EXCEPT
SELECT col1, col2 FROM table1 WHERE col3 = 'SSSS' AND col4 = 'TTTT';

一个重要的考虑因素是要知道你想要的答案是否需要和或运算符。你想看到col3 ='SSSS'和col4的值不同于col4 ='TTTT'的记录吗?

如果答案是否定的,您应该使用以下版本:

SELECT col1, col2 FROM table1           
EXCEPT
SELECT col1, col2 FROM table1 WHERE col3 = 'SSSS' OR col4 = 'TTTT';

您可以详细了解MINUS or EXCEPT operator on the Amazon Redshift documentation here.