我在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中有SSSS
和TTTT
的项目,以及我正在查找的两个表格中的任何一个中的col4。
我非常擅长编写查询以从数据库中提取信息,所以请忍受我的无知。我被告知要探索GROUP BY
和ORDER 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;
我不知道该怎么办。我很感激任何帮助。谢谢!
答案 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.