0

dateにウィジェットに発生するイベントwidget_eventsを記録するテーブルがあります。同じイベントが同じ日に同じウィジェットに対して複数回発生する可能性があります。このため、このような行を区別するための主キーとして列が使用されます。テーブル宣言は次のとおりです。event_whatwidget_idevent_whenevent_id

CREATE TABLE widget_events
(
event_id    int4 UNIQUE NOT NULL,
event_when  date NOT NULL,
event_what  text NOT NULL,
widget_id   int4 REFERENCES widgets (widget_id) NOT NULL,
PRIMARY KEY (event_id)
);

クライアント アプリケーションはイベントをバッチで処理します。各バッチは、1 つの日付の 1 つのウィジェットのすべてのイベントで構成されます。ただし、アプリケーションは、どのウィジェットと日付が に格納されているかを事前に認識していませんwidget_events

widget_events考えられる解決策の 1 つは、 (SQL の を使用して)から 1 つのランダムな行を選択することから始めてから 、同じandLIMITを持つすべての行に対して別のクエリを実行することです。このバッチが処理された後、これらの行は から削除でき、最初のステップに戻ります。最初のステップで、返すランダムな行がなくなったと報告されると、アルゴリズムは停止します。widget_idwidget_whenwidget_events

私の質問は、これを行うためのより高速でエレガントな方法があるかどうかです。SQL (特に PostgreSQL が理解する SQL) で、単一のクエリでそれぞれの個別のバッチを返すことは可能ですか?

4

2 に答える 2

3

個別のバッチを選択するには:

select  distinct event_when
,       event_what
from    widget_events

または、次のように、1 つのクエリで 1 つのバッチを取得することもできます。

select  batch.*
from    widget_events batch
join    (
        select  event_when
        ,       event_what
        from    widget_events
        limit   1
        ) filter
on      filter.event_when = batch.event_when
        and filter.event_what = batch.event_what
于 2012-12-03T15:35:33.583 に答える
1

event_whenで並べ替えられた行を返すだけではどうでしょうか。

select *
from widget_events we
order by event_when, event_what, event_id

event_whatもスローしたので、同様のイベントはすべて連続した行になります。

ロジックは、日付がいつ変更されるかを検索して、何かが最後のイベントであるかどうかを判断できます。必要に応じて、これを選択に入れることもできます。

select *,
       (case when lag(event_when) over (partition by event_id) < event_when then 1
             else 0
        end) as isFirst,
       (case when lead(event_when) over (partition by event_id) < event_when then 1
             else 0
        end) as isLast
from widget_events we
order by event_when, event_what, event_id
于 2012-12-03T15:42:45.937 に答える