按datediff对行进行分组,然后使用diff函数

Tomasgabrs

我在PostgreSQL中有带时间戳列created_at和整数列的表user_id

id | created_at | user_id
1 | 2019-10-14 09:26:53.813 | 1
2 | 2019-10-14 09:26:54.813 | 1
3 | 2019-10-14 09:46:53.813 | 1
4 | 2019-10-14 09:46:54.813 | 2
5 | 2019-10-14 09:46:55.813 | 1
6 | 2019-10-14 09:46:56.813 | 1
7 | 2019-10-14 09:46:57.813 | 2

每行代表用户的某些操作。我需要计算平均用户会话长度。会话定义为时间差小于10分钟的一组动作。当两个用户操作之间相差10分钟或更长时间时,新会话开始。

我在想:

  1. 将行分组user_id
  2. 通过单个用户当前项目和下一项之间的差异将行分组(以某种方式)。(获得会议)
  3. 计算一组(会话)中第一行和最后一行之间的差异。(以获取会话长度)
  4. 计算平均会话时长。(以获取平均会话时长)

但是我不能用SQL编写它。

您能给我一些建议/示例如何在SQL中完成吗?

男装

分步演示:db <> fiddle

SELECT 
    user_id,
    AVG(diff)
FROM (
    SELECT DISTINCT
        user_id,
        group_id,
        first_value(created_at) OVER (PARTITION BY user_id, group_id ORDER BY created_at DESC)
            - first_value(created_at) OVER (PARTITION BY user_id, group_id ORDER BY created_at) as diff
    FROM (
        SELECT
            id, created_at, user_id,
            SUM(group_id) OVER (PARTITION BY user_id ORDER BY created_at) AS group_id
        FROM (
            SELECT
                *,
                (created_at 
                    - lag(created_at, 1, created_at) OVER (PARTITION BY user_id ORDER BY created_at)
                    > interval '10 minutes')::int AS group_id
            FROM
                mytable   
        )s
    )s
)s
GROUP BY user_id
  1. (created_at - lag(created_at, 1, created_at) OVER (PARTITION BY user_id ORDER BY created_at) > interval '10 minutes')::int AS group_idlag() 窗口函数created_at从有序user_id分区(组)中取自上一个记录值(第二个参数:步长,第三个参数:如果没有上一个记录==当前值,则为默认值)。然后created_at计算当前值与前一个值之间的差如果此值> 10分钟,则结果为true; false除此以外。该布尔值可以转换为一个int值,结果为01
  2. 累积SUM()0/1值,这导致group_idS表示每每一个新的会话user_id
  3. 每个user_id会话的第一个created_at时间戳group_id可以通过first_value()window函数获取,最后一个byfirst_value()DESCorder可以获取不同之处在于您每次会话的时长。使用该DISTINCT子句是因为将差值放在每个记录上。但是我们只需要一次。
  4. 最后,您可以AVG()为用户分组和区别。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

按条件对行进行分组

来自分类Dev

Excel-按列对行进行分组,然后按另一列进行排序

来自分类Dev

使用分组依据按2列对行进行计数

来自分类Dev

按多个值对行进行分组

来自分类Dev

按日期范围对行进行分组

来自分类Dev

使用函数diff与非顺序行进行聚合

来自分类Dev

(My)SQL:按给定字段对行进行分组,并强制在分组行中使用最新数据

来自分类Dev

按DF分组,然后使用dplyr进行过滤

来自分类Dev

对行进行分组而不调用聚合函数

来自分类Dev

SQL Pivot函数可对行进行分组

来自分类Dev

SQL Server按日期时间对行进行分组并获得使用总数

来自分类Dev

使用 sed 或 awk 按 URL 对 Apache 日志行进行分组?

来自分类Dev

使用预先计算的数字对行进行分组

来自分类Dev

使用 PARTITION BY 在 Oracle 中对行进行分组

来自分类Dev

按值组的连续日期范围对行进行分组

来自分类Dev

根据ID按字母顺序对所有行进行分组

来自分类Dev

如何按季度对数据框中的行进行分组?

来自分类Dev

熊猫:按CSV文件中的列表对行进行分组?

来自分类Dev

Python / Numpy:按通用元素对数组行进行分组

来自分类Dev

需要帮助按年份和区分月份对行进行分组

来自分类Dev

按值组的连续日期范围对行进行分组

来自分类Dev

如何按多列对CSV行进行分组

来自分类Dev

MySQL:按列值前缀对行进行分组

来自分类Dev

VBA 按 TRUE/FALSE 条件对行进行分组

来自分类Dev

按类别对前 N 行进行分组和排名

来自分类Dev

按 PostgreSQL 中的递增列对行进行分组

来自分类Dev

如何防止GNU diff对补丁的行进行分组?

来自分类Dev

在聚合函数之前对分组的行进行排序

来自分类Dev

有没有办法按给定数据集中值的百分比窗口对数据行进行分组,然后遍历数据集?

Related 相关文章

  1. 1

    按条件对行进行分组

  2. 2

    Excel-按列对行进行分组,然后按另一列进行排序

  3. 3

    使用分组依据按2列对行进行计数

  4. 4

    按多个值对行进行分组

  5. 5

    按日期范围对行进行分组

  6. 6

    使用函数diff与非顺序行进行聚合

  7. 7

    (My)SQL:按给定字段对行进行分组,并强制在分组行中使用最新数据

  8. 8

    按DF分组,然后使用dplyr进行过滤

  9. 9

    对行进行分组而不调用聚合函数

  10. 10

    SQL Pivot函数可对行进行分组

  11. 11

    SQL Server按日期时间对行进行分组并获得使用总数

  12. 12

    使用 sed 或 awk 按 URL 对 Apache 日志行进行分组?

  13. 13

    使用预先计算的数字对行进行分组

  14. 14

    使用 PARTITION BY 在 Oracle 中对行进行分组

  15. 15

    按值组的连续日期范围对行进行分组

  16. 16

    根据ID按字母顺序对所有行进行分组

  17. 17

    如何按季度对数据框中的行进行分组?

  18. 18

    熊猫:按CSV文件中的列表对行进行分组?

  19. 19

    Python / Numpy:按通用元素对数组行进行分组

  20. 20

    需要帮助按年份和区分月份对行进行分组

  21. 21

    按值组的连续日期范围对行进行分组

  22. 22

    如何按多列对CSV行进行分组

  23. 23

    MySQL:按列值前缀对行进行分组

  24. 24

    VBA 按 TRUE/FALSE 条件对行进行分组

  25. 25

    按类别对前 N 行进行分组和排名

  26. 26

    按 PostgreSQL 中的递增列对行进行分组

  27. 27

    如何防止GNU diff对补丁的行进行分组?

  28. 28

    在聚合函数之前对分组的行进行排序

  29. 29

    有没有办法按给定数据集中值的百分比窗口对数据行进行分组,然后遍历数据集?

热门标签

归档