2016-11-03 3 views
1

「session_change」という新しい列に1を割り当てるこのクエリがあります。 これは、(現在の行の日付)と(前の行の日付)の差が30分(30 * 60秒)。特定のパラメータに対してパーティションを修正する方法このクエリで同じ日付の日付順に並べ替えますか?

Sample Output

しかし、私は問題を抱えている:

これらは、日付/エポック/ session_changeです。

エポック秒で結果の行に同じ日付がある場合。それは、差が30分より大きい場合、session_changeと同じエポック秒のうち最後の1秒をマークします。 (同じエポック秒はこれらの値が1475053048.00000のレコードです)

1474460665.00000から1475053048.00000に変更すると、スナップショットに表示されている最後のレコードがマークされます。

同じエポック秒のうち、最初のレコードでsession_changeをマークする方法。

ご協力いただきありがとうございます。

SELECT * 
    , CASE 
      WHEN EXTRACT(EPOCH FROM date) - LAG(EXTRACT(EPOCH FROM date)) OVER (PARTITION BY userid ORDER BY date) >= 30 * 60 
      THEN 1 
    ELSE 0 
    END as session_change 
FROM 
    <table_name> 
order by date; 
+0

どのDBMSですか?オラクル? Postgres?レッドシフト?実際に使用しているDBMSのみにタグを付けてください。 –

+0

postgresql/redshift – onlinetravel

+1

注文を指定する別の列がない限り、* first *レコードはありません。もしあなたが好きなら、*すべてのレコードに印を付けることができます。 –

答えて

0

これは本当にひどい「ソリューション」ですが、クエリとあなたの出力のselect *は、私たちが例にネクタイがある場合とき来る何行かを決定するために活用することができ、他のフィールドが本当に存在しないことを示します。したがって、実際にできることは、出力のレンダリングを偽造することです。

SELECT *, 
    CASE 
    WHEN EXTRACT(EPOCH FROM date) - 
     LAG(EXTRACT(EPOCH FROM date)) OVER (PARTITION BY userid ORDER BY date) >= 30 * 60 
    THEN 1 
    ELSE 0 END as session_change 
FROM 
    <table_name> 
order by date, session_change desc 
+0

ありがとうございました!出来た。それについて考えなかった – onlinetravel

関連する問題