SQL Server-汇总数据的案例声明

时间:2018-10-04 23:24:28

标签: sql-server

我有一个问题,无法根据用户登录的设备类型来唯一地标识给定用户。

我的数据集如下

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

dataset description

2 个答案:

答案 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个月时会发生什么?您的数据中没有日期字段吗?

另请参阅:http://rextester.com/GJBHH85148

答案 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不足以表示日期或时间,它必须至少有一年才能区分每年(至少)几个月。 (也许有一列代表年份?)...