获取appPackage和appActivity

首先 adb devices 要可以看到调试的android 设备
然后打开要获取的包并进入到对应的界面

adb shell dumpsys window w|grep name

这条命令就可以看到所有启动中的包和activety,找到需要的那条即可
1698897006988.jpg

文本替换

  • 替换当前行第一个

    :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相反

VIM适用外部命令

  • :!command
    demo:

    :!ls
    :!rm file

文件另存为

  • :w newfilename
  • v motion :w newfilename 选择文本另存为

导入文件内容

  • r importfilename importfilename的内容讲导入到当前光标后
  • r :!command 讲外部命令的回显输入到当前光标后

切换大小写

  • ~ 在view模式切换到小写
  • !! 在view模式切换到大写

login_log 登录日志表
username 用户名
game_id 登录游戏ID
login_date 登录日期
usernamegame_idlogin_date
da3592023-05-01
ul1082023-05-03
da1082023-05-02
da1922023-05-11
da2082023-05-18
ul3592023-05-17
ul1082023-04-23
da1082023-04-12

需要在login_log表中找到用户最后一次登录所在的游戏id
期望结果

usernamegame_idlogin_date
da2082023-05-18
ul3592023-05-17

如果单独查用户的最后登录日期很简单

select username,max(login_date) from login_log group by username;

查出用户最后登录日期所在行的游戏id就比较麻烦
有以下几种方案

  1. 连表不等式过滤

    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 当天登录了两个不同游戏,则会出现两条记录

    usernamegame_idlogin_date
    da2082023-05-18
    ul3592023-05-17
    da3592023-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不可用

  2. 嵌套排序子查询配合窗口函数

    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 等数据库依然不适用

  3. clickhouse的方法
    clickhouse会比前面简单很多

    select * from login_log order by username,login_date desc,game_id limit 1 by username;

    直接在 limit中可以添加限制,简单粗暴
    粗暴是因为在大数据表中性能不咋样,建议根据实际情况适用


参考:
stackoverflow
github-clickhouse