如何在不使用 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 子句的情况下对行进行分组的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有“非分组字段x”的情况下对“SUM”进行“HAVING”用于HAVING子句
如何在不使用 Group By / 有函数的情况下过滤 SQL 中的数据
如何在没有附加查询的情况下在 SQL Server 中连接没有子查询的 GROUP BY 子句中的字符串?
如何优化执行嵌套在 group-by 子句中的计数的 SQL 查询?
我们如何在具有GROUP BY子句的查询中选择非聚合列,而GROUP BY子句在功能上不依赖于GROUP BY子句中的列?