Appium 笔记
获取appPackage和appActivity
首先 adb devices
要可以看到调试的android 设备
然后打开要获取的包并进入到对应的界面
adb shell dumpsys window w|grep name
这条命令就可以看到所有启动中的包和activety,找到需要的那条即可
首先 adb devices
要可以看到调试的android 设备
然后打开要获取的包并进入到对应的界面
adb shell dumpsys window w|grep name
这条命令就可以看到所有启动中的包和activety,找到需要的那条即可
替换当前行第一个
:s/old/new
替换当前行所有
:s/old/new/g
替换指定行数内所有
:#,#s/old/new/g
替换文件内所有
:%s/old/new/g
需要确认
:%s/old/new/gc
适用括号{}
()
[]
%
CTRL-G
显示当前行号和文件状态G
跳到文件末尾gg
跳到文件开头#G
跳到#指定的行号CTRL-O
跳到之前看的位置,CTRL-I
相反:!command
demo:
:!ls
:!rm file
:w newfilename
v motion :w newfilename
选择文本另存为r importfilename
importfilename的内容讲导入到当前光标后r :!command
讲外部命令的回显输入到当前光标后login_log 登录日志表
username 用户名
game_id 登录游戏ID
login_date 登录日期
username | game_id | login_date |
---|---|---|
da | 359 | 2023-05-01 |
ul | 108 | 2023-05-03 |
da | 108 | 2023-05-02 |
da | 192 | 2023-05-11 |
da | 208 | 2023-05-18 |
ul | 359 | 2023-05-17 |
ul | 108 | 2023-04-23 |
da | 108 | 2023-04-12 |
需要在login_log表中找到用户最后一次登录所在的游戏id
期望结果
username | game_id | login_date |
---|---|---|
da | 208 | 2023-05-18 |
ul | 359 | 2023-05-17 |
如果单独查用户的最后登录日期很简单
select username,max(login_date) from login_log group by username;
查出用户最后登录日期所在行的游戏id就比较麻烦
有以下几种方案
连表不等式过滤
select l1.*
from login_log l1
left join login_log l2
on l1.username=l2.username and l1.login_date<l2.login_date
where l2.login_date is null;
原理:l1
表的每一行都会匹配0到n条 username
相同的 l2
表记录,且这些匹配到的记录登录的时间都比 l1
的记录更新,又因为是 left join
所以 l1
表中最新的那条登录的记录会匹配到一个空行(ps.如果用inner join
这一条就被抛弃了)
注意:
如果 login_log
表中插入一条记录
insert into login_log values('da','359','2023-05-18');
此时 da 这个用户在2023-05-18 当天登录了两个不同游戏,则会出现两条记录
username | game_id | login_date |
---|---|---|
da | 208 | 2023-05-18 |
ul | 359 | 2023-05-17 |
da | 359 | 2023-05-18 |
要避免这种情况需要将sql改的再复杂一些
select l1.*
from login_log l1
left join login_log l2
on l1.username=l2.username
and (l1.login_date<l2.login_date
or (l1.login_date=l2.login_date and l1.id<l2.id)
)
where l2.login_date is null;
用一个id或其他唯一字段做不等式相比即可保证只出现一条记录
再次注意:
此方法不是所有数据库可用,如clickhouse就不支持不相等的连接条件,即l1.login_date<l2.login_date
不可用
嵌套排序子查询配合窗口函数
select *
from (
select
username,
first_value(game_id) over
(
partition by username
order by login_date desc
) game_id,
first_value(login_date) over
(
partition by username
order by login_date desc
) login_date
from login_log
) t
group by username,game_id,login_date;
原理:
窗口函数 first_value() over()
直接找到over()
条件中的第一行,得到一个冗余数据集后在通过group by
去掉冗余
注意:
clickhouse 等数据库依然不适用
clickhouse的方法
clickhouse会比前面简单很多
select * from login_log order by username,login_date desc,game_id limit 1 by username;
直接在 limit
中可以添加限制,简单粗暴
粗暴是因为在大数据表中性能不咋样,建议根据实际情况适用
如果您看到这篇文章,表示您的 blog 已经安装成功.