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

これを理解できる人は誰でも事前に感謝します。特にGROUP BY関数では、とにかくpostgresqlをまだ学んでいます。ティア

4

2 に答える 2

4

主キーによるグループ化は意味がありません。これは定義上、一意であるため、主キーごとに常に 1 つのグループを取得します。

どうやら、各 URL を 1 回だけ表示したいようです。その場合、どの pkey と last_visited の値を表示するかを決定する必要があります。

以下は、最初の last_visited と、一意の 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 デモを参照してください: 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 list_websites WHERE ( ( NOW() - last_visited ) > INTERVAL '12 hour' OR last_visited IS NULL ) ORDER BY url ASC;

于 2012-11-09T09:48:46.743 に答える