sql >> データベース >  >> RDS >> PostgreSQL

同時ユーザーセッションの最大数を計算する

    各時間範囲の終了(または開始)から30分を差し引きます。次に、基本的に、私の参照されている「単純な」回答 に概説されているように進めます。 (どこでも正しい方向に30分間調整します)。 30分より短い範囲は事前に排除されます。これは、30分の連続オーバーラップの一部になることは決してないため、理にかなっています。また、クエリが高速になります。

    2019年10月のすべての日を計算する(範囲の例):

    WITH range AS (SELECT timestamp '2019-10-01' AS start_ts  -- incl. lower bound
                        , timestamp '2019-11-01' AS end_ts)   -- excl. upper bound
    , cte AS (
       SELECT userid, starttime
           -- default to current timestamp if NULL
            , COALESCE(endtime, localtimestamp) - interval '30 min' AS endtime
       FROM   usersessions, range r
       WHERE  starttime <  r.end_ts  -- count overlaps *starting* in outer time range
       AND   (endtime   >= r.start_ts + interval '30 min' OR endtime IS NULL)
    
       )
    , ct AS (
       SELECT ts, sum(ct) OVER (ORDER BY ts, ct) AS session_ct
       FROM  (
          SELECT endtime AS ts, -1 AS ct FROM cte
          UNION ALL
          SELECT starttime    , +1       FROM cte
          ) sub
       )
    SELECT ts::date, max(session_ct) AS max_concurrent_sessions
    FROM   ct, range r
    WHERE  ts >= r.start_ts
    AND    ts <  r.end_ts            -- crop outer time range
    GROUP  BY ts::date
    ORDER  BY 1;
    

    db <> fiddle こちら

    LOCALTIMESTAMPに注意してください 現在のセッションのタイムゾーンによって異なります。テーブルでtimestamptzを使用し、CURRENT_TIMESTAMPを使用することを検討してください 代わりは。参照:




    1. 最高のPostgreSQLGUIはどれですか? 2021年の比較

    2. ユーザー名がphp経由でmysqlテーブルに存在するかどうかを確認しますか?

    3. 列の値が明確でないすべての行を選択する方法

    4. OracleのMySQL一時テーブルの代替