我有一个PostgreSQL表,其中包含以下相关字段:
url title created_at
可以有许多行包含相同的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`
我正在尝试获取列出以下字段的输出:
1)url
2)title
对应于该唯一created_at
的全部计数的最高值3)title
url
因此,上面示例的输出行看起来像这样:
www.nytimes.com | The New York Times Online | 2 www.wsj.com | The Wall Street Journal | 1
基于我在类似问题上阅读的众多SO帖子,看起来我获得前两个字段(url
和最新title
)的最佳选择是使用DISTINCT ON
:
select distinct on (url) url, title from headlines order by url, created_at desc
同样,为了获得第一个和第三个字段(url
以及所有的字数title
),我可以简单地使用GROUP BY
:
select url, count(title) from headlines group by url
我无法弄清楚的是如何结合上述方法并获得我想要获得的上述三个值.
(编辑提供更清晰.)
这可以在一个单一的做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;
SQL小提琴.
相关(详细说明):
在应用LIMIT之前获得结果计数的最佳方法
选择每个GROUP BY组中的第一行?
PostgreSQL:按分钟运行查询的行数