在滚动窗口内根据频率为 IP 分配排名

问题描述 投票:0回答:1

在每个 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
sql snowflake-cloud-data-platform rank dense-rank
1个回答
0
投票

这适用于 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
© www.soinside.com 2019 - 2024. All rights reserved.