在每个 ID 中,我尝试根据过去 3 个月内出现的频率对每个 IP 进行排名。例如,在下表中,IP 98.28.88.148 的排名应为 1,因为它们在过去 3 个月内出现次数最多。 IP 166.194.154.19 的排名应为 2,IP 64.227.19.120 的排名应为 3,因为它的出现频率最低。如果 2 个 IP 出现相同的次数,则应为它们分配相同的排名。
身份证 | 登录_TS_三个月_之前 | 登录_TS | IP | 之前三个月的登录计数 |
---|---|---|---|---|
1234 | 2023-08-04T13:40:08.512Z | 2023-11-02T13:40:08.512Z | 64.227.19.120 | 0 |
1234 | 2023-08-04T14:35:46.717Z | 2023-11-02T14:35:46.717Z | 64.227.19.120 | 1 |
1234 | 2023-08-06T00:56:25.895Z | 2023-11-04T00:56:25.895Z | 98.28.88.148 | 0 |
1234 | 2023-08-10T15:50:21.845Z | 2023-11-08T15:50:21.845Z | 98.28.88.148 | 1 |
1234 | 2023-08-11T17:07:28.623Z | 2023-11-09T17:07:28.623Z | 98.28.88.148 | 2 |
1234 | 2023-08-12T16:52:18.59Z | 2023-11-10T16:52:18.59Z | 98.28.88.148 | 3 |
1234 | 2023-08-18T23:17:12.471Z | 2023-11-16T23:17:12.471Z | 166.194.154.19 | 0 |
1234 | 2023-08-22T20:42:57.979Z | 2023-11-20T20:42:57.979Z | 166.194.154.19 | 1 |
1234 | 2023-08-25T22:36:52.638Z | 2023-11-23T22:36:52.638Z | 166.194.154.19 | 2 |
理想的输出应该是这样的:
身份证 | 登录_TS_三个月_之前 | 登录_TS | IP | 之前三个月的登录计数 | IP_排名 |
---|---|---|---|---|---|
1234 | 2023-08-04T13:40:08.512Z | 2023-11-02T13:40:08.512Z | 64.227.19.120 | 0 | 3 |
1234 | 2023-08-04T14:35:46.717Z | 2023-11-02T14:35:46.717Z | 64.227.19.120 | 1 | 3 |
1234 | 2023-08-06T00:56:25.895Z | 2023-11-04T00:56:25.895Z | 98.28.88.148 | 0 | 1 |
1234 | 2023-08-10T15:50:21.845Z | 2023-11-08T15:50:21.845Z | 98.28.88.148 | 1 | 1 |
1234 | 2023-08-11T17:07:28.623Z | 2023-11-09T17:07:28.623Z | 98.28.88.148 | 2 | 1 |
1234 | 2023-08-12T16:52:18.59Z | 2023-11-10T16:52:18.59Z | 98.28.88.148 | 3 | 1 |
1234 | 2023-08-18T23:17:12.471Z | 2023-11-16T23:17:12.471Z | 166.194.154.19 | 0 | 2 |
1234 | 2023-08-22T20:42:57.979Z | 2023-11-20T20:42:57.979Z | 166.194.154.19 | 1 | 2 |
1234 | 2023-08-25T22:36:52.638Z | 2023-11-23T22:36:52.638Z | 166.194.154.19 | 2 | 2 |
这适用于 SQLServer(我不知道 SnowFlake):
select
Id
, Login_TS
, IP
, ( select count(*)
from YrTbl L3M
where L3M.ID=TTbl.ID
and L3M.IP=TTbl.IP
and L3M.Login_TS >= dateadd(month, -3,TTbl.Login_TS)
and L3M.Login_TS < TTbl.Login_TS) LoginsLast3Mths
, DENSE_RANK()
OVER (PARTITION BY TTbl.ID, Ttbl.IP
order by
(select count(*)
from YrTbl L3M
where L3M.ID=TTbl.ID
and L3M.IP=TTbl.IP
and L3M.Login_TS >= dateadd(month, -3,TTbl.Login_TS)
and L3M.Login_TS < TTbl.Login_TS)
desc
) as IP_Ranking
from YrTbl TTbl