sql 中的排名序列

Rank sequences in sql

我有一个 table 类似这样的:

User ID creation_time   Clicked Rank
2.30417E+13 10:39:03 AM FALSE   1
2.30417E+13 10:40:35 AM TRUE    1
2.30417E+13 10:40:36 AM TRUE    2
2.30417E+13 10:40:50 AM FALSE   1
2.30417E+13 10:41:20 AM TRUE    1
2.30417E+13 10:41:36 AM TRUE    2
2.30417E+13 10:42:41 AM TRUE    3
2.30417E+13 10:42:41 AM TRUE    4
2.30417E+13 10:44:23 AM TRUE    5
2.30417E+13 10:44:34 AM TRUE    6
2.30417E+13 10:44:36 AM TRUE    7
2.30417E+13 10:44:39 AM TRUE    8
2.30417E+13 10:44:44 AM TRUE    9
2.30417E+13 10:44:50 AM TRUE    10
2.30417E+13 10:44:53 AM TRUE    11
2.30417E+13 10:44:56 AM TRUE    12
2.30417E+13 10:45:05 AM TRUE    13
2.30417E+13 10:45:40 AM FALSE   1
2.30417E+13 10:45:41 AM TRUE    1
2.30417E+13 10:46:07 AM TRUE    2
2.30417E+13 10:46:07 AM TRUE    3
2.30417E+13 10:46:08 AM TRUE    4

排名列是我想要对行进行排名的方式。在 table 我有数百个用户,我想根据他完成的 clicks/no 点击次数的顺序对每个用户进行排名。 任何的想法?我试过 rank ,row_number,它们的不同设置.. 想不通。

您需要 row_number() 的分组列。这可以计算为 运行 用户 ID 和 clicked 列的值之和,其中 clicked 为 false。

所以:

select t.*,
       row_number() over (partition by userid, clicked, grp order by creation_time) as rank
from (select t.*,
             sum(case when clicked = false then 1 else 0 end) over (partition by userid order by creation_time) as grp
      from t
     ) t;

有时,Amazon 需要 windowing 子句用于 window 函数,因此您可能需要 rows between unbounded preceding and current row。 Postgres 没有这个要求。