微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在第一个表的列中指定的日期之前实现连接以获取第二个表中所有记录的计数

如何解决如何在第一个表的列中指定的日期之前实现连接以获取第二个表中所有记录的计数

我有两张表,我们称它们为用户、事件

users: [user_id,activity_date]
       [123,4-28-2020    ]
       [456,4-27-2020    ]

events: [user_id,event_date]
       [123,5-28-2020    ]
       [456,4-27-2020    ]
       [456,4-25-2020    ]
       [456,4-30-2020    ]
       [456,1-30-2020    ]
       [123,1-28-2020    ]

我想得到一个汇总表,为每个用户显示事件表中存储在 users.activity_date 中的值之前的事件计数。

所以上面的例子会产生:

[user_id,total]
[123,1  ]
[456,3  ]    

我对如何编写这个有点困惑,我知道我需要加入 user_id,然后根据指定的 activity_date 值过滤事件中的 activity_date 值......有人知道怎么做吗?

>

解决方法

一个简单的方法是关联子查询:

select u.*,(select count(*)
        from events
        where e.user_id = u.user_id and e.event_date < u.activity_date
       ) as events_before
from users u;

另一种方法使用窗口函数和累积和:

select u.*,e.cnt
from users u left join
     (select e.*,lead(event_date) over (partition by user_id order by event_date) as next_event_date,row_number() over (partition by user_id order by event_date) as cnt
      from events e
     ) e
     on u.user_id = e.user_id and
        u.activity_date >= e.event_date and
        (u.activity_date < e.next_event_date or e.next_event_date is null);

这不是完全相同的逻辑。它计算完全同时发生的事件(因此它不是“严格在之前”。此外,如果事件完全在同一时间发生,事情就会变得棘手。

这两个都可以修复,但它们使逻辑复杂化,所以我坚持这个。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?