sql - Sql按userId查询前两行分组
问题描述
我有这样的数据
deviceId | userId | Time
20 | 1 | 2-Jan-18
21 | 1 | 2-Jan-19
22 | 1 | 2-Jan-10
30 | 2 | 2-Jan-18
30 | 2 | 2-Jan-19
我想查询用户使用的 2 个第一台设备以及时间(按 userId 分组)
userId|firstDeviceId|firstDeviceTime|secondDeviceId|secondDeviceTime
1 |20 | 2-Jan-18 | 21 | 2-Jan-19
2 |30 | 2-Jan-18 | 30 | 2-Jan-19
各位大神能告诉我怎么做吗?谢谢
解决方案
一个典型的方法使用row_number()
和条件聚合:
select userid,
max(case when seqnum = 1 then deviceid end) as deviceid_1,
max(case when seqnum = 1 then devicetime end) as devicetime_1,
max(case when seqnum = 2 then deviceid end) as deviceid_2,
max(case when seqnum = 2 then devicetime end) as devicetime_2
from (select t.*, row_number() over (partition by userid order by device time desc) as seqnum
from t
) t
where seqnum <= 2
group by userid;
推荐阅读
- vba - 如何计算访问vba中的页面加载时间
- javascript - 如何使用javascript在txt文件的新行中打印对象数组的每个对象?
- python - Python 代理如何使用 ElasticAPM 跟踪各种计数器/值随时间的演变?
- android - 为什么“C”!=“C”?
- java - 为什么我的 JavaFX 按钮有奇怪的符号而不是文本?
- python - 使用beautifulsoup4,Python在html标签内查找链接
- python - Flask-WTF 自定义验证 FileField 关于图片像素大小
- markdown - 如何更改 Hugo 网站中头像持有者的样式?
- angular - 角 | 是否有可能导致 *ngIf 只运行一次?
- javascript - 在javascript中访问同一对象中的对象值