1

r_event列のあるデータベーステーブルがあります。

event_start (date), 
event_stop (date),
insurance_id (integer) 

r_insuranceおよび列のあるテーブル:

insurance_id serial primary key,
insurance_name (text)

各保険には、によってリンクされたいくつかのイベントがありますinsurance_id

私がしようとしているのは:
SELECT insurance_id, insurance_name-それぞれ1つだけで、最大の
もので並べ替える:-?? event_stop
ORDER BY event_stop DESC NULLS LAST

r_insurance (insurance_id, insurance_name)
1 | rca
2 | casco
3 | itp

r_event (insurance_id, event_start, event_stop)
1 | 12.10.2012 | 27.11.2012
1 | 07.05.2012 | 24.06.2012
2 | 21.01.2013 | 14.02.2013

出力は次のようになります。

1 | casco-最大のevent_stopを持つイベントがあるため  
2 | rca-最大のevent_stopの後に最初のevent_stopがあるため  
3 | itc-イベントがないため

event_stop最初のドラフトを編集しました。イベントの降順で最大のとを並べて表示したいと思いますNULLS LAST

4

2 に答える 2

2
SELECT i.insurance_id, i.insurance_name, max(e.event_stop) latest_stop
FROM   r_insurance i
LEFT   JOIN r_event e USING (insurance_id)
GROUP  BY 1, 2
ORDER  BY latest_stop DESC NULLS LAST;

あなたの例では、関連する行がないLEFT JOIN行を失うことを避けるために不可欠です。しております。また、 の前にカンマはありません。r_insurancer_eventitc
ORDER BYDESCNULLS LAST

PostgreSQL 9.1 では、主キーはリスト内のテーブルの集計されていないすべての列をカバーするSELECTため、簡略化できます (詳細はこちら)。

SELECT i.insurance_id, i.insurance_name, max(e.event_stop) latest_stop
FROM   r_insurance i
LEFT   JOIN r_event e USING (insurance_id)
GROUP  BY 1
ORDER  BY latest_stop DESC NULLS LAST;

sqlfiddle のデモ。

于 2012-06-07T21:45:44.937 に答える
1

「GROUP BYで実行できますが、何をどのように行うのかよくわかりません」

Group by はリレーションを取得し、それをすべての行が同じ値を持つパーティションに分割します。そこから、結果リレーションの各パーティションから 1 つの行を取得します。全体ではなく、各パーティションに対して集計関数が使用されます。おそらく次のように定式化できます。

SELECT
 insurance_id,
 insurance_name,
 max(stop) max_stop
FROM r_event JOIN r_insurance
 ON r_event.insurance_id = r_insurance.insurance_id
GROUP BY insurance_id, insurance_name
ORDER BY max_stop, NULLS LAST
于 2012-06-07T11:53:53.537 に答える