SQLの専門家ではないため、次のことに苦労しています。
私は、ほとんど短命の現象の段階遷移を表すタイムスタンプ付きのイベントを含む大きなテーブル (約 1 億行) を継承しました。残念ながら、イベントはやや奇妙な方法で記録されており、テーブルは次のようになっています。
phen_ID record_time producer_id consumer_id state ...
000123 10198789 start
10298776 000123 000112 hjhkk
000124 10477886 start
10577876 000124 000123 iuiii
000124 10876555 end
各現象 (phen-ID) には開始イベントと理論的には終了イベントがありますが、まだ発生していないため記録されていない可能性があります。その後、各現象はいくつかの状態を経ることがあります。残念ながら、一部の州では、ID は製品または消費者フィールドのいずれかに記録されます。また、状態の数は固定されておらず、状態間の時間も固定されていません。
まず、各 phen-ID について開始時刻と最後に記録されたイベント (終了状態または中間状態のいずれか) の時刻を示す SQL ステートメントを作成する必要があります。
単一の phen-ID を考慮して、次の SQL をまとめることができました。
WITH myconstants (var1) as (
values ('000123')
)
select min(l.record_time), max(l.record_time) from
(select distinct * from public.phen_table JOIN myconstants ON var1 IN (phen_id, producer_id, consumer_id)
) as l
start-state は常に特定の現象の最小の記録時間を持つため、上記のステートメントは、終了状態に関係なく、記録された時間範囲を 1 つの行として正しく返します。
明らかに、ここでは phen-ID を手動で指定する必要があります。
一意の phen-ID ごとに開始時間と最大記録時間の行を取得するには、どうすればこれを機能させることができますか? のようなものに収まるように試行錯誤しましたselect distinct phen-id ...
が、それらを上記に自動的に「フィード」することはできませんでした。それとも、私はここで完全に的外れですか?
追加: 明確にするために、上記の表を使用した理想的な出力は次のようになります。
ID min-time max-time
000123 10198789 10577876 (min-time is start, max-time is state iuii)
000124 10477886 10876555 (min-time is start, max-time is end state)