我有一个问题,无法根据用户登录的设备类型来唯一地标识给定用户。
我的数据集如下
FIRST_NM LAST_NM LOGIN_MONTH DEVICE_TYP
------------------------------------------
JOHN DOE 4 Desktop
JOHN DOE 5 Desktop
JOHN DOE 6 Phone
JOHN DOE 6 Desktop
JANE DOE 4 Phone
JANE DOE 5 Desktop
JANE DOE 5 Phone
JANE DOE 6 Desktop
JANE DOE 6 Phone
我想根据最近3种登录模式来总结结果。
FIRST_NM LAST_NM DEVICE_TYP
-------------------------------------------------------
JOHN DOE Active Desktop User
JANE DOE Active on Both Desktop and Mobile
答案 0 :(得分:1)
您可以使用row_number() over(...)
确定最近3次登录(有点,请参见下面的注释):
select
FIRST_NM
, LAST_NM
, max(case when rn = 1 then DEVICE_TYP end) as DEVICE_TYP_1
, max(case when rn = 2 then DEVICE_TYP end) as DEVICE_TYP_2
, max(case when rn = 3 then DEVICE_TYP end) as DEVICE_TYP_3
from (
select
*
, row_number() over(partition by FIRST_NM,LAST_NM order by LOGIN_MONTH DESC) as rn
from mytable
) d
where rn <= 3
group by
FIRST_NM
, LAST_NM
产生以下结果:
FIRST_NM LAST_NM DEVICE_TYP_1 DEVICE_TYP_2 DEVICE_TYP_3
---------- --------- -------------- -------------- --------------
JANE DOE Desktop Phone Desktop
JOHN DOE Phone Desktop Desktop
称为“ login_month”的列并不是确定“最后3次登录”的一种非常精确的方法,当您在明年1月,而先前的登录分别在第12和11个月时会发生什么?您的数据中没有日期字段吗?
答案 1 :(得分:0)
我不确定您的逻辑应该属于平等的哪一部分。在您的示例结果中,JANE使用了Phone 3次,使用了Desktop 2次。因此,Jane应该是移动用户。但是,您可以通过将设备使用次数除以总登录次数来得出用户设备的平均使用情况,这将为您提供一个确定用户首选设备类型(最常用)的好方法。
因此,在您的结果中,John在台式机上的平均使用量约为75%,在手机上为25%,这意味着他更喜欢使用台式机而不是移动设备。而Jane的台式机平均占有率为40%,Phone的平均占有率为60%,这意味着Jane连续使用两种设备。
如果这是您的逻辑工作方式,则可以执行以下操作:
SELECT *
,
CASE
WHEN AvgDesktopUsage >= 70 AND AvgPhoneUsage <= 30 THEN 'Active Desktop User'
WHEN AvgPhoneUsage >= 70 AND AvgDesktopUsage <= 30 THEN 'Active Mobile User'
ELSE 'Active on Both Desktop and Mobile'
END
FROM (
SELECT *
, ( Desktop / CAST(TotalLogins AS FLOAT) ) * 100 AvgDesktopUsage
, ( Phone / CAST(TotalLogins AS FLOAT) ) * 100 AvgPhoneUsage
FROM (
SELECT
FIRST_NM
, LAST_NM
, SUM(CASE WHEN DEVICE_TYP = 'Desktop' THEN 1 ELSE 0 END) Desktop
, SUM(CASE WHEN DEVICE_TYP = 'Phone' THEN 1 ELSE 0 END) Phone
, COUNT(*) TotalLogins
FROM yourTable
WHERE
LOGIN_MONTH >= MONTH(GETDATE()) - 3
AND LOGIN_MONTH <= MONTH(GETDATE())
GROUP BY
FIRST_NM, LAST_NM
HAVING
COUNT(*) > 2
) D
) E
您可以更改平均逻辑以适合您的需求。另外,LOGIN_MONTH不足以表示日期或时间,它必须至少有一年才能区分每年(至少)几个月。 (也许有一列代表年份?)...