0

这个 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

4

2 回答 2

4

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

显然您只想查看每个网址一次。在这种情况下,您必须决定要查看哪个 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

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

于 2012-11-09T09:56:32.807 回答
2

您可以使用 DISTINCT ON:

SELECT DISTINCT ON (url) pkey,url,last_visited FROM listing_websites WHERE ( (NOW() - last_visited ) > INTERVAL '12 hour' OR last_visited IS NULL ) ORDER BY url ASC;

于 2012-11-09T09:48:46.743 回答