【问题标题】:How to group rows without using GROUP BY clause如何在不使用 GROUP BY 子句的情况下对行进行分组
【发布时间】: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 标签是不兼容的。您是否需要适用于两者的解决方案?
  • 不,谢谢。我已经处理过了。

标签: postgresql tsql grouping window-functions


【解决方案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 的
    猜你喜欢
    • 2021-04-06
    • 2012-01-26
    • 1970-01-01
    • 2014-10-22
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    相关资源
    最近更新 更多