运行Postgres查询按一个字段分组并按另一个字段排序

jay*_*ayp 1 sql postgresql aggregate greatest-n-per-group window-functions

我有一个PostgreSQL表,其中包含以下相关字段:

url
title
created_at
Run Code Online (Sandbox Code Playgroud)

可以有许多行包含相同的URL但标题不同.以下是一些示例行:

www.nytimes.com | The New York Times         | 2016-01-01 00:00:00`
www.wsj.com     | The Wall Street Journal    | 2016-01-03 15:32:13`
www.nytimes.com | The New York Times Online  | 2016-01-06 07:19:08`
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取列出以下字段的输出:

1)url
2)title对应于该唯一created_at
的全部计数的最高值3)titleurl

因此,上面示例的输出行看起来像这样:

www.nytimes.com | The New York Times Online | 2
www.wsj.com     | The Wall Street Journal   | 1
Run Code Online (Sandbox Code Playgroud)

基于我在类似问题上阅读的众多SO帖子,看起来我获得前两个字段(url和最新title)的最佳选择是使用DISTINCT ON:

select distinct on (url) url, title from headlines order by url, created_at desc 
Run Code Online (Sandbox Code Playgroud)

同样,为了获得第一个和第三个字段(url以及所有的字数title),我可以简单地使用GROUP BY:

select url, count(title) from headlines group by url
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚的是如何结合上述方法并获得我想要获得的上述三个值.

(编辑提供更清晰.)

Erw*_*ter 5

这可以在一个单一的做SELECT一个结合-在桌子上有一个单一的扫描窗函数DISTINCT ON:

SELECT DISTINCT ON (url)
       url, title, count(*) OVER (PARTITION BY url) AS ct 
FROM   headlines 
ORDER  BY url, created_at DESC NULLS LAST;
Run Code Online (Sandbox Code Playgroud)

SQL小提琴.

相关(详细说明):