繁体   English   中英

如何在PostgreSQL中对数据进行分组?

[英]How to group data in PostgreSQL?

该PostgreSQL查询基本上显示的是12小时之前的数据列表。

SELECT * FROM listing_websites 
WHERE ( ( NOW() - last_visited ) > INTERVAL '12 hour'  OR last_visited IS NULL )
GROUP BY url,pkey ORDER by pkey ASC

显示的数据将如下所示。 pkey是“主键”

pkey |  url   | last_visited
12   | link1  | 2012-11-08 17:06:49.553515  
13   | link2  | 2012-11-07 05:36:55.270243
14   | link1  | 2012-11-09 08:54:33.51958
15   | link3  | 2012-11-03 16:29:17.20889
17   | link1  | 2012-11-08 05:54:33.51958

我要实现的是将url列分组,例如:

pkey |  url   | last_visited
12   | link1  | 2012-11-08 17:06:49.553515  
13   | link2  | 2012-11-07 05:36:55.270243
15   | link3  | 2012-11-03 16:29:17.20889

预先感谢任何可以解决此问题的人。 无论如何我还是在学习postgresql,尤其是在GROUP BY函数中。 TIA

按主键分组没有任何意义。 因为按照定义,它是唯一的,所以每个主键总是可以得到一组。

显然,您只希望一次查看每个网址。 在这种情况下,您必须确定要与此一起查看的pkey和last_visited值。

以下为每个唯一的url值选择第一个last_visited和最低的pkey值:

select min(pkey), url, min(last_visited)
from listing_websites
where ( ( NOW() - last_visited ) > INTERVAL '12 hour'  OR last_visited IS NULL )
group by url;

它给出了示例输出,但是我不确定这是否是您想要的。

在此处查看SQLFiddle演示: http ://sqlfiddle.com/#!12/2cbf7/1

如果您需要更多列,则需要一种不同的方法(并且应该从一开始就提到):

select * 
from (
    select pkey, url, last_visited, url2, url3,
           row_number() over (partition by url order by pkey) as rn
    from listing_websites
    where ( ( NOW() - last_visited ) > INTERVAL '12 hour'  OR last_visited IS NULL )
) t
where rn = 1;

请参阅我更新的SQLFiddle示例: http ://sqlfiddle.com/#!12/6236f/1

下次,请在您的第一个问题中包含所有要求,不要将其一点一点地提供给我们。

您可以使用DISTINCT ON:

SELECT DISTINCT ON(url)pkey,url,last_visited from listing_websites WHERE((NOW()-last_visited)> INTERVAL '12 hours'或last_visited IS NULL)ORDER BY url ASC;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM