2012-11-09 20 views
0

此PostgresSQL查詢基本上顯示12小時內舊數據的列表。如何在PostgresSQL中對數據進行分組

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

顯示的數據看起來像這樣。 p鍵是「主鍵」

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 

我想實現的是組例如網址欄:

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

回答

2

您可以使用DISTINCT ON:

SELECT DISTINCT ON(URL)p鍵,網址,last_visited FROM listing_websites WHERE((NOW() - last_visited)>間隔'12小時」 OR last_visited IS NULL) ORDER BY url ASC;

+1

請注意,如果沒有完整的ORDER BY子句,'DISTINCT ON'不一定是確定性的。 –

+0

我想我已經解釋了我想要做的事情。我甚至把輸出我想要哈哈。無論如何,謝謝 –

4

通過主鍵分組沒有意義。因爲它 - 根據定義 - 是唯一的,您將永遠爲每個主鍵獲得一個組。

顯然你只想看到每個網址一次。在這種情況下,你必須決定你想看到哪個pkey和last_visited值。

下選擇第一last_visited,最低p鍵爲每個唯一的URL值值:

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

下一次,請在您的initi 所有要求一個問題,不要把它們一點一點地餵給我們。

+0

是的,這也是正確的。 –

+0

這一個工程,但如果你包括其他列如select min(pkey),url,min(last_visited),url2,url3例如 –

+0

@KennethPalaganas:那麼url2突然從哪裏來。你不覺得你應該在你原來的問題中提到過嗎?看到我的編輯解決方案。 –

相關問題