PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Oblicz maksymalną liczbę jednoczesnych sesji użytkownika

Odejmij 30 minut od końca (lub początku) każdego przedziału czasowego. Następnie postępuj zgodnie z opisem w mojej wspomnianej „prostej” odpowiedzi (regulacja przez 30 min wszędzie we właściwym kierunku). Zasięgi krótsze niż 30 minut są eliminowane a priori - co ma sens, ponieważ nigdy nie mogą być częścią 30-minutowego okresu ciągłego nakładania się. Sprawia również, że zapytanie jest szybsze.

Obliczanie dla wszystkich dni w październiku 2019 r. (przykładowy zakres):

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 tutaj

Pamiętaj, że LOCALTIMESTAMP zależy od strefy czasowej bieżącej sesji. Rozważ użycie znacznika czasu w tabeli i CURRENT_TIMESTAMP zamiast. Zobacz:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wygeneruj n wierszy NULL w PostgreSQL

  2. Najlepszy sposób na sprawdzenie pustej lub zerowej wartości

  3. Jaka jest przyczyna PGError:FATAL:przerwanie połączenia z powodu komendy administratora na heroku?

  4. Jak upuścić jeden klucz łączenia podczas dołączania do dwóch stołów?

  5. Kodowanie znaków (UTF-8) w sesji PowerShell