如何用SQL查询每个用户每日的最后所在区域位置?
查询每个用户每日最后所在区域的SQL方案
数据表
| abonent | region_id | dttm |
|---|---|---|
| 7072110988 | 32722 | 2021-08-18 13:15 |
| 7072110988 | 32722 | 2021-08-18 14:00 |
| 7072110988 | 21534 | 2021-08-18 14:15 |
| 7072110988 | 32722 | 2021-08-19 09:00 |
| 7071107101 | 12533 | 2021-08-19 09:15 |
| 7071107101 | 32722 | 2021-08-19 09:27 |
字段说明
abonent:用户号码region_id:用户所在区域IDdttm:通话日期时间
下面提供两种可行的SQL写法,根据你的数据库版本选择:
方法一:窗口函数法(推荐,适用于MySQL 8+、PostgreSQL、SQL Server等)
用ROW_NUMBER()窗口函数给每个用户每天的记录按时间倒序编号,取编号为1的就是当天最后一条记录:
SELECT abonent, DATE(dttm) AS record_date, region_id FROM ( SELECT abonent, dttm, region_id, -- 按用户+日期分组,组内按时间倒序排号 ROW_NUMBER() OVER (PARTITION BY abonent, DATE(dttm) ORDER BY dttm DESC) AS rn FROM your_table_name ) t WHERE rn = 1;
方法二:关联子查询法(兼容旧版数据库如MySQL 5.x)
先统计每个用户每天的最晚通话时间,再关联原表获取对应区域:
SELECT t1.abonent, DATE(t1.dttm) AS record_date, t1.region_id FROM your_table_name t1 INNER JOIN ( -- 子查询得到每个用户每天的最晚时间 SELECT abonent, DATE(dttm) AS record_date, MAX(dttm) AS max_dttm FROM your_table_name GROUP BY abonent, DATE(dttm) ) t2 ON t1.abonent = t2.abonent AND DATE(t1.dttm) = t2.record_date AND t1.dttm = t2.max_dttm;
注意:把代码里的your_table_name替换成你实际的表名。
内容的提问来源于stack exchange,提问作者useless
相关产品推荐
相关产品推荐

