当前位置: 首页 > 知识库问答 >
问题:

查找用户第一次和第二次监听之间的平均时间

贺轶
2023-03-14

假设我有一个音乐平台的用户监听的下表:

其中,id(int)是收听音乐(或书籍或任何其他材料)的用户的记录,user_id(int)是收听者id,started_at(timestamp)是用户开始收听的时间,finished_at是用户完成收听的时间

我需要做的是找出用户第一次和第二次收听之间的平均时间。例如,对于user_id=101的第一个用户,它将是:

“2017-10-05 15:15:30”(started_at列,第二行)-“2017-10-05 13:59:03”(finished_at,第一行)

这就产生了1小时15分钟的时差。

对于这种情况,我编写了以下代码:

   SELECT  user_id, (TIMESTAMPDIFF(SECOND, pDataDate, started_at)/3600)
   FROM    (
        SELECT  *,
                LAG(finished_at) OVER (ORDER BY finished_at) pDataDate
        FROM    listenings
    
        ) q
   WHERE   pDataDate IS NOT NULL

我的问题是处理表中只有一个user_id的情况(本例中user_id=102)。它只有一行,表示started_at和finished_at在同一列。我不知道如何正确地写一个陈述,结合这两个案例。有没有人可以建议一个包含这两种情况的查询(可以使用if/case语句)?

还有,我想找到一种方法,只取组的前两个最上面行的平均值。假设,对于user_id=101,我将只取行1和行2之间的平均值。

谢谢你,如果我写得不清楚,我很抱歉。我可能会编辑问题以方便阅读

共有1个答案

夹谷阳夏
2023-03-14

使用row_number()代替lag()。然后可以使用聚合:

SELECT user_id,
        TIMESTAMPDIFF(SECOND, MAX(finished_at), NULLIF(MIN(finished_at), MAX(finished_at))) / 3600
FROM (SELECT l.*,
             ROW_NUMBER() OVER (PARTITION BY user_id ORJDER BY finished_at) as seqnum
      FROM listenings l    
     ) l
WHERE seqnum <= 2
GROUP BY user_id;

如果用户只有一行,则返回null

 类似资料:
  • 问题内容: 在下面的代码中,迭代运行两次。 是否可能恰好在第一次迭代和第二次迭代之间运行“ test2 <-true”? 我的意思是,在第一次迭代结束而第二次迭代未开始时,是否将true发送给“ test2”? 问题答案: 是。由于您的频道已缓冲,可以保存1个值。主执行流程可以继续进行,而无需您的匿名goroutine读取您发送到通道的值,并且可以在goroutine唤醒并读取通道上的值之前在通道

  • 我尝试做什么: 我希望HashSet中充满程序不知道的新词。用户按下主机上的“转换”按钮。带有单词的文件的路径在主框架上给出。 如果单词是新单词,则会打开一个J对话框并要求插入新单词(因此您可以更改拼写,例如第一个字母大…)。 如果用户按下JDialog上的“写入”按钮,该单词将添加到HashSet中。 但是如果我在那之后打印我的HashSet,则只显示“旧”值。当我第二次按下主框架上的“转换”按

  • 问题内容: 我有一个简单的AJAX表单,该表单可以在提交时正常运行。但是,如果我随后将新数据输入相同的表单(而不刷新页面),则它将提交两次表单。如果我第三次这样做,那么它将第三次提交表单,依此类推。为什么这样做呢?这是我的代码: 问题答案: 即使我在开发AJAX登录表单时也遇到了同样的问题。搜寻了几个小时后,我找到了解决方案。希望这对您有所帮助。 基本上,您必须在ajax请求完成后 取消绑定 表单

  • 我有以下RxJava2 Kotlin代码: 这模拟了一个可完全观察的对象(想象对API的一个简单更新操作),然后是一个可观察的对象(图像是API上的一个get操作)。我希望以一种方式连接这两个可观察对象,当Completable完成时,运行单个对象,最后在我的观察者(Int 42)上获得onSuccess事件。 但是,此测试代码不起作用。断言失败,出现以下错误: 我无法理解我做错了什么,我希望Co

  • 问题内容: 我正在尝试用JavaFX创建我的第一个应用程序,而Button调用一个方法时遇到了问题(例如,打开另一个窗口)-我总是必须单击两次才能触发操作。 这是来自控制器的代码: 我的方法在这里实现: 问题答案: 最有可能在FXML中包含以下内容: 这使您的按钮可以调用您的方法。但是,您没有定义要在单击按钮时执行的逻辑,而是第一次说:“单击此按钮时,在我的按钮上放一个会叫“ 因此,您的第一次单击

  • 我正在对PeopleSoft数据库进行查询,不确定是否可以根据初始查询在一次调用中从同一个表中获取信息。例如,我正在访问的表返回EmployeeID、FullName、FirstName、LastName、Position\u NBR和ReportsTo。但是ReportsTo是以经理的Position\u NBR(在同一个表中找到)的形式提供的,我想以name格式提供。我想这样做,但不确定是否可