在编写SQL几年之后,我发现将SELECT
感兴趣的列放在GROUP BY
然后再次在SELECT
中再次指定它通常很烦人。我不能帮助思考,为什么我们必须这样做?
用户必须具体说明要分组的列的原因是什么?如果CASE WHEN
中有一个聚合函数,其他非聚合列分组,那么我们不能让SQL引擎假设吗?
如果SELECT
中有一个较大的{{1}},这将特别有用且更简洁。
答案 0 :(得分:5)
因为它们可能并不总是完全匹配。
例如,如果我想查找每个类别的最大书籍数量,我可以这样做:
select max(cnt)
from (
select count(*) as cnt
from books
group by category
) t;
在某些数据库(如Oracle)中,您甚至可以这样做:
select max(count(*))
from books
group by category;
我不需要指定类别列,因为我不需要它。
Postgres等一些数据库支持在group by子句中使用别名。
答案 1 :(得分:2)
我碰巧赞同你。如果有人想要更深奥的System.out.print(j + " ")
- 比如说,遗漏列 - 那么他们可以使用子查询。
如果我不得不猜测,SQL的编写者不想在聚合函数中灌输如此强大的功能。您的建议意味着group by
中的函数正在确定结果集中行的定义。通常,select
只会确定列。也就是说,查询失败语法是一回事,因为包含的聚合没有select
。 group by
中的函数更改要输出的行是另一回事。
您可以将窗口功能与select
一起使用。虽然我不推荐使用语法,但您可以这样做:
select distinct
嗯,这消除了select distinct x, count(*) over (partition by x)
from t;
,但你仍然需要在每个窗口函数中重复分组标准。