group_by_session_extended.sql 763 B

123456789101112131415161718192021
  1. /* syntax version 1 */
  2. /* postgres can not */
  3. $init = ($row) -> (AsStruct($row.ts ?? 0 as value, 1 as count));
  4. $calculate = ($_row, $state) -> ($state.value);
  5. -- split partition into two-element grooups, make session key to be cumulative sum of ts from partition start
  6. $update = ($row, $state) -> {
  7. $state = AsStruct($state.count + 1 as count, $state.value as value);
  8. $state = AsStruct($state.count as count, $state.value + ($row.ts ?? 0) as value);
  9. return AsTuple(Unwrap($state.count % 2) == 1, $state);
  10. };
  11. SELECT
  12. user,
  13. SessionStart() as session_start,
  14. ListSort(AGGREGATE_LIST(ts ?? 100500)) as session,
  15. COUNT(1) as session_len
  16. FROM plato.Input
  17. GROUP BY SessionWindow(ts, $init, $update, $calculate), user
  18. ORDER BY user, session_start;