同一天的第一个电话和最后一个电话sql

Create table If Not Exists Calls (caller_id int, recipient_id int, call_time datetime)

Truncate table Calls

insert into Calls (caller_id, recipient_id, call_time) values ('8', '4', '2021-08-24 17:46:07')

insert into Calls (caller_id, recipient_id, call_time) values ('4', '8', '2021-08-24 19:57:13')

insert into Calls (caller_id, recipient_id, call_time) values ('5', '1', '2021-08-11 05:28:44')

insert into Calls (caller_id, recipient_id, call_time) values ('8', '3', '2021-08-17 04:04:15')

insert into Calls (caller_id, recipient_id, call_time) values ('11', '3', '2021-08-17 13:07:00')

insert into Calls (caller_id, recipient_id, call_time) values ('8', '11', '2021-08-17 22:22:22')

 

编写一个 SQL 查询来找出那些ID们在任意一天的第一个电话和最后一个电话都是和同一个人的。这些电话不论是拨打者还是接收者都会被记录。

结果请放在一个任意次序约束的表中。

 

SELECT DISTINCT 
  u1 user_id
FROM (
  SELECT 
      u1, u2, dt
  FROM (
  SELECT # 2. 用户一天内通话行为的时间先后
      u1, u2, DATE(call_time) dt,
      ROW_NUMBER() OVER(PARTITION BY u1, DATE(call_time) ORDER BY call_time asc) rk_asc,
      ROW_NUMBER() OVER(PARTITION BY u1, DATE(call_time) ORDER BY call_time desc) rk_desc
    FROM (
      # 1. 列出用户所有的通话行为(呼出,或接听)
      SELECT caller_id u1, recipient_id u2, call_time FROM Calls
      UNION ALL 
      SELECT recipient_id u1, caller_id u2, call_time FROM Calls) t1) t2 
  WHERE rk_asc = 1 or rk_desc = 1 # 3. 筛选出用户一天内的第一通和最后一通通话
) t3
GROUP BY u1, dt # 4. 按用户日期聚合
HAVING COUNT(DISTINCT u2) = 1 # 5. 筛选出一天内,第一通和最后一通电话都为同一人的记录。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值