You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Employees与Online_Transactions表获取唯一用户最新登录记录

问题描述

需求背景

  • 需求目标:根据用户使用的在线平台不同,获取唯一的当前用户记录,同时判断用户近1个月是否处于活跃状态,若近1个月不活跃则需获取用户最后一次活跃时间。
  • 涉及两张表:
    • Employees表:存储离职员工的离职日期与唯一ID,该ID是和在线交易表关联的外键
    • Online Transactions表:基于月度报告生成,存储从各在线平台拉取的全量用户清单,包含ID激活日期、最后登录日期、平台内角色、存储数据量等核心字段,当前共覆盖3个平台的数据:Portal、AGOL、Training
  • 业务用途:基于两张表管理在线工具权限,同时统计各平台单用户的整体使用情况

现存问题

现有查询SQL返回大量重复记录,原因是DISTINCT作用于查询的全部字段而非仅用户Tracking ID,任意字段值不同都会被判定为独立记录,无法获取每个用户的唯一最新记录。
原查询SQL如下:

SELECT DISTINCT   
    U.EMPLOYEE_TRACKING_ID,U.LAST_NAME, U.FIRST_NAME, U.EMAIL_ADDRESS, U.PERSON_TYPE, 
    U.SERVICE_LINE, U.SUPERVISOR_NAME, U.OFFICE_LOCATION, U.OFFICE_CITY, U.OFFICE_STATE, 
    U.OFFICE_COUNTRY, U.OFFICE_POSTAL_CODE, U.ACTUAL_TERMINATION_DATETIME, O.FiscalPeriod, 
    O.Role, O.Source, O.LogDate
FROM  dbo.Users U
INNER JOIN dbo.Online_Transactions O ON U.EMPLOYEE_TRACKING_ID = O.TrackingId
WHERE O.Source ='AGOL'

待解决疑问

是否需要通过嵌套子查询按办公地点分组,来获取每个唯一用户对应的最新登录日期?计划针对三类平台分别创建在职、离职2种视图,共6个视图,该需求的正确实现方式是什么?

解决方案

核心去重逻辑

不需要嵌套子查询按办公地点分组,使用窗口函数ROW_NUMBER()即可实现按用户维度取最新登录记录:按用户唯一ID分区,按登录日期倒序排序,取每个分区排名为1的记录,就是对应用户的最新登录数据。

通用基础查询示例(以AGOL平台为例)

WITH UserLatestLogin AS (
    SELECT 
        U.EMPLOYEE_TRACKING_ID,
        U.LAST_NAME, 
        U.FIRST_NAME, 
        U.EMAIL_ADDRESS, 
        U.PERSON_TYPE, 
        U.SERVICE_LINE, 
        U.SUPERVISOR_NAME, 
        U.OFFICE_LOCATION, 
        U.OFFICE_CITY, 
        U.OFFICE_STATE, 
        U.OFFICE_COUNTRY, 
        U.OFFICE_POSTAL_CODE, 
        U.ACTUAL_TERMINATION_DATETIME, 
        O.FiscalPeriod, 
        O.Role, 
        O.Source, 
        O.LogDate,
        -- 按用户ID分区,按登录日期倒序排名
        ROW_NUMBER() OVER (PARTITION BY U.EMPLOYEE_TRACKING_ID ORDER BY O.LogDate DESC) AS rn,
        -- 新增近1个月活跃状态标记
        CASE WHEN O.LogDate >= DATEADD(MONTH, -1, GETDATE()) THEN '是' ELSE '否' END AS IsLastMonthActive
    FROM dbo.Users U
    INNER JOIN dbo.Online_Transactions O ON U.EMPLOYEE_TRACKING_ID = O.TrackingId
    WHERE O.Source = 'AGOL' -- 替换为Portal/Training即可对应不同平台
)
SELECT *
FROM UserLatestLogin
WHERE rn = 1 -- 仅保留每个用户的最新一条记录
-- 筛选在职/离职可追加对应条件:
-- 在职:AND (ACTUAL_TERMINATION_DATETIME IS NULL OR ACTUAL_TERMINATION_DATETIME > GETDATE())
-- 离职:AND ACTUAL_TERMINATION_DATETIME <= GETDATE()

6个视图创建方案

仅需修改上述SQL中的平台参数Source和在职/离职筛选条件,即可快速创建全部所需视图:

  • AGOL平台在职用户视图:Source = 'AGOL' + 在职筛选条件
  • AGOL平台离职用户视图:Source = 'AGOL' + 离职筛选条件
  • Portal平台在职用户视图:Source = 'Portal' + 在职筛选条件
  • Portal平台离职用户视图:Source = 'Portal' + 离职筛选条件
  • Training平台在职用户视图:Source = 'Training' + 在职筛选条件
  • Training平台离职用户视图:Source = 'Training' + 离职筛选条件

补充说明

如果同一用户同一登录日期存在多条角色不同的记录,可根据业务需求调整ROW_NUMBER()的排序规则,比如追加O.Role作为第二排序维度,或改用RANK()函数保留同日期的多条符合条件的记录。

内容的提问来源于stack exchange,提问作者JoeW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:54:02