0

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)
4

2 に答える 2

1

あなたは正しい軌道に乗っていると思います。これを試して、探しているものかどうかを確認してください。

select
    min(l.record_time)
    ,max(l.record_time)
    ,coalesce(phen_id, producer_id, consumer_id) as [Phen ID]
from public.phen_table
group by coalesce(phen_id, producer_id, consumer_id)
于 2020-11-18T22:19:43.307 に答える