如何在不使用 GROUP BY 子句的情况下对行进行分组

Posted

技术标签:

【中文标题】如何在不使用 GROUP BY 子句的情况下对行进行分组【英文标题】:How to group rows without using GROUP BY clause 【发布时间】:2019-08-27 20:35:13 【问题描述】:

假设我有一个简单的表:

   Date          Price
-----------------------
2012-01-05        23
2015-04-08        145
2016-03-09        12
2015-09-09        87
2000-01-15        23
2016-01-15        89
2016-07-12        23
2012-04-08        65

我想按年份对这些行进行分组,但不使用 GROUP BY 子句。如果我可以添加另一个包含年份或表示组的字符的列,那就太好了,如下所示:

Date          Price     Group
-------------------------------
2012-01-05        23      1
2015-04-08        145     2
2016-03-09        12      3
2015-09-09        87      2
2000-01-15        23      4
2016-01-15        89      3
2016-07-12        23      3
2012-04-08        65      1

我尝试过使用 over() 子句,但老实说,我不知道哪个函数与 over() 一起使用。

【问题讨论】:

select *, extract(year from Date) as Group from table; ? Ehhh 我很尴尬,因为它很棒,所以......简单;s 一般来说 PostgreSQL 和 TSQL 标签是不兼容的。您是否需要适用于两者的解决方案? 不,谢谢。我已经处理过了。 【参考方案1】:

从日期中提取年份和dense_rank的组合可以解决问题

select *,
dense_rank ()  OVER(order by extract(year from Date))
from YOURTABLE

【讨论】:

【参考方案2】:

如果您只想添加另一列,请尝试执行 CASE

SELECT DATE, 
       PRICE,
  CASE DATE_PART('YEAR', DATE) WHEN 2015 THEN 1 
                               WHEN 2016 THEN 2 ... END


FROM MYTABLE 

但是如果你想得到一些东西的聚合,那么你可以使用 OVER() 或 GROUP BY

【讨论】:

在 PostgreSQL 中应该是 date_part('year', Date) 也更短:case date_part('year', date) when 2015 then 1 when 2016 then 2 ... end @Abelisto 谢谢,我进行了编辑,没有意识到问题是针对 Postgre 的

以上是关于如何在不使用 GROUP BY 子句的情况下对行进行分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 GROUP BY 子句的情况下获取列值

如何在没有“非分组字段x”的情况下对“SUM”进行“HAVING”用于HAVING子句

如何在不使用 Group By / 有函数的情况下过滤 SQL 中的数据

如何在没有附加查询的情况下在 SQL Server 中连接没有子查询的 GROUP BY 子句中的字符串?

如何优化执行嵌套在 group-by 子句中的计数的 SQL 查询?

我们如何在具有GROUP BY子句的查询中选择非聚合列,而GROUP BY子句在功能上不依赖于GROUP BY子句中的列?