如何在PostgreSQL中分组数据?

如何在PostgreSQL中分组数据?,postgresql,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是“主键” 我想要实现的是对url列进行分组,例如: pkey | url | last_vis

此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是“主键”

我想要实现的是对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,尤其是在函数分组中。TIA

您可以在以下位置使用DISTINCT:

从列表中选择不同的(url)pkey、url、上次访问的网站,其中((现在()-上次访问)>间隔“12小时”或上次访问为空)按url ASC排序


您可以在以下位置使用DISTINCT:

从列表中选择不同的(url)pkey、url、上次访问的网站,其中((现在()-上次访问)>间隔“12小时”或上次访问为空)按url ASC排序


按主键分组没有意义。因为根据定义,它是唯一的,所以每个主键总是有一个组

显然,您只想看到每个url一次。在这种情况下,您必须决定您希望看到的pkey和last_访问值

下面为每个唯一url值选择访问的第一个最后一个_和最低的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演示:

如果您需要更多的专栏,您需要一种不同的方法(您应该从一开始就提到这一点):

请参见我更新的SQLFiddle示例:


下次请在您的初始问题中包含所有要求,不要一点一点地向我们提供

按主键分组没有意义。因为根据定义,它是唯一的,所以每个主键总是有一个组

显然,您只想看到每个url一次。在这种情况下,您必须决定您希望看到的pkey和last_访问值

下面为每个唯一url值选择访问的第一个最后一个_和最低的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演示:

如果您需要更多的专栏,您需要一种不同的方法(您应该从一开始就提到这一点):

请参见我更新的SQLFiddle示例:


下次请在您的初始问题中包含所有要求,不要一点一点地向我们提供

请注意,如果没有完整的ORDERBY子句,
DISTINCT ON
不一定是确定性的。我想我已经解释了我要做的事情。我甚至把我想要的输出放在lol上。无论如何,感谢没有完整的ORDER BY子句,
DISTINCT ON
不一定是确定性的。我想我已经解释了我要做的事情。我甚至把我想要的输出放在lol中。无论如何,感谢这一个可以工作,但如果你包括其他列,如select min(pkey)、url、min(上次访问)、url2、url3,就不行了example@KennethPalaganas:那么url2突然从何而来。你不认为你应该在最初的问题中提到这一点吗?请参阅“我的编辑”以获得解决方案。如果您包含其他列,如select min(pkey)、url、min(上次访问)、url2、url3,则此选项不起作用example@KennethPalaganas:那么url2突然从何而来。你不认为你应该在最初的问题中提到这一点吗?请参阅我的编辑以获取解决方案。
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;