【问题标题】:Conditional group by (group similar items) in PostgreSQLPostgreSQL 中的条件分组依据(分组相似项)
【发布时间】:2012-01-11 09:10:23
【问题描述】:

我有以下疑问:

SELECT s.id,
       s.name,
       s.prom,
       s.some_other_field,
       ... many more fields also
FROM mytable s
INNER JOIN (on some other tables etc.)

如果有超过6条具有相同name(s.name)的记录,我想将这些项目组合为一行(我不在乎还有哪些其他数据分组到该行,即该组的第一条记录就可以了)。

这在 Postgres 中可行吗?我想这是一个条件分组,从某种意义上说,我想将相同名称出现超过 6 次的记录分组,同时正常返回所有其他记录。

非常感谢任何帮助 - 谢谢!

【问题讨论】:

  • s.id 是相同的还是可能有所不同?
  • s.id 会有所不同,但对于分组行,理想情况下应该包含该组第一行的数据(如果有意义的话!)
  • SELECT [field names] FROM [table name] WHERE [conditions] (INNER/OUTER JOINS) .... GROUP BY [field name] HAVING [conditions]

标签: sql database postgresql


【解决方案1】:

你可以这样做:

select * from (

    SELECT s.id,
           s.name,
           s.prom,
           s.some_other_field,
           ... many more fields also,
           row_number() over (partition by s.name order by s.id) as rnk,
           count(*) over (partition by s.name) cnt
    FROM mytable s
    INNER JOIN (on some other tables etc.)

) a
where cnt < 6 or (cnt >=6 and rnk = 1)

【讨论】:

  • +1,条件实际上可能更短:cnt &lt; 6 or rnk = 1
猜你喜欢
  • 2021-02-11
  • 2012-07-17
  • 1970-01-01
  • 2015-12-19
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 2014-11-20
相关资源
最近更新 更多