繁体   English   中英

具有最后结束日期的 SQL 查询非活动用户

SQL Query Inactive Users with last end date

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

这是我一年前问的一个问题的后续旧线程我当时得到的答案效果很好,但现在我发现我需要调整查询才能获得非活动用户的最新结束日期。

因此,这里再次提供一个快速的用户示例表,有些是活跃的,有些是不活跃的,有些则有几个工作期。

当某人重新就业时,将为该就业期添加一个新行。 用户名将始终相同。

所以我想找到哪些用户是残疾人并且没有活跃的工作,如果有几个工作期,我想要一个有最晚结束日期的用户。 每个用户名一行,包含所有列。

数据库是 SQL Server 2016。

示例表:

|  username | name       | active | Job title   | enddate 
+-----------+----------- +--------+-------------+----------
| 1111      | Jane Doe   |    1   | CIO         | 1/3/2022
| 1111      | Jane Doe   |    0   | Janitor     | 1/2/2018
| 1112      | Bob Doe    |    1   | Coder       | NULL
| 1113      | James Doe  |    0   | Coder       | 1/3/2018
| 1114      | Ray Doe    |    1   | Manager     | NULL
| 1114      | Ray Doe    |    0   | Clerk       | 2/2/2019
| 1115      | Emma Doe   |    1   | Waiter      | NULL
| 1116      | Sarah Doe  |    0   | Greeter     | 3/4/2016
| 1116      | Sarah Doe  |    0   | Trainer     | 4/5/2019

因此,对于用户 1116,我最好在 2019 年 4 月 5 日获得一行

我从旧线程中的答案中使用的查询是这样的:

    ;WITH NonActiveDisabledUsers AS
(
    SELECT DISTINCT
        U.username
    FROM
        UserEmployment AS U
    WHERE
        U.active = 0 AND
        NOT EXISTS (SELECT 'no current active employment' 
                    FROM UserEmployment AS C
                    WHERE U.username = C.username AND 
                    C.active = 1 AND
                    (C.enddate IS NULL OR C.enddate >= CONVERT(DATE, GETDATE())))
)
SELECT
    R.*
FROM
    NonActiveDisabledUsers AS N
    CROSS APPLY (
        SELECT TOP 1        -- Just 1 record
            U.*
        FROM
            UserEmployment AS U
        WHERE
            N.username = U.username AND
            U.active = 0
        ORDER BY
            U.enddate DESC  -- Determine which record should we display
        ) AS R

这为我提供了正确的用户和就业状态,但不是最新的结束日期,因为它将获得用户 1116 的第一个结果

3 个回复

我们可以使用条件聚合和窗口聚合来获取该用户的活动行数。

然后我们过滤到仅处于非活动状态,并按enddate对结果进行行编号,取每组的第一行:

SELECT
    username,
    name,
    active,
    [Job title],
    enddate 
FROM (
    SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY username ORDER BY enddate DESC)
    FROM (
        SELECT *,
          CountOfActive = COUNT(CASE WHEN
                Active = 1 AND
                (enddate IS NULL OR enddate >= CONVERT(DATE, GETDATE())) THEN 1 END
              ) OVER (PARTITION BY username)
        FROM UserEmployment
    ) AS t
    WHERE CountOfActive = 0
) AS t
WHERE rn = 1;

请注意,行编号不考虑最后排序的enddate中的空值。 您需要有条件的排序:

ROW_NUMBER() OVER (PARTITION BY username ORDER BY CASE WHEN enddate IS NULL THEN 0 ELSE 1 END ASC, enddate DESC)

嗯。 . . 我认为您可以获取最新的记录并检查它是否处于活动状态:

select ue.*
from (select ue.*,
             row_number() over (partition by user_id
                                order by active desc, enddate desc
                               ) as seqnum
      from UserEmployment ue
     ) ue
where seqnum = 1 and active = 0;

这是一个会产生所需结果的变体:

 SELECT distinct username, max(enddate)  
  FROM UserEmployment as t1
  WHERE
    t1.active = 0 AND 
    NOT EXISTS (select username from UserEmployment as t2 WHERE active = 1 AND
                    (t2.enddate IS NULL OR t2.enddate >= CONVERT(DATE, GETDATE())) AND
                     t1.username = t2.username)
  GROUP BY username
1 选择所有非活动用户的SQL查询

我有一个查询要实现。 我有2个表: user和login_logs表。 用户表如下所示: id || first_name || last_name || 电子邮件 || 用户名 || 激活 || 暂停 1 || 约翰|| 丹|| john @ what ...

2011-03-02 10:23:25 2 521   mysql/ sql
2 SQL查询以查找最后日期

我们将生产的第二天在数据库中输入生产数据,我正在使用以下查询来获取昨天的数据。 查询工作正常,直到周末之后,由于星期一没有生产,星期一不显示任何内容。 无论如何,我可以更改查询以显示生产的最后一天。 ...

2016-12-06 18:29:16 1 132   sql
3 SQL查询根据日期和月份检索用户

我有下表: 用户 用户身份 CompanyID 名称 活跃 加入日期 Date_Left 我正在尝试查询要计费的用户,条件是: 加入计费月份的用户不被视为计费用户。 帐单月份剩余的用户是收费用户。 我有以下 ...

4 Oracle SQL查询中的开始/结束日期和时间

我需要一个查询输出,如下表所示; 这是表的主要条目,这些记录将由我无法控制的第三方程序修改。 谁能建议一个好的样品? 我试过了 但是此查询引发错误ORA-00907: missing right parenthesis 。 ...

7 删除具有重复名字和姓氏的 WP 用户的 SQL 查询

我们有一个 woocommerce 网站,该网站多年来一直在进行后门注册,从而产生了数千个垃圾邮件帐户。 我已经能够删除所有“.ru”和其他垃圾邮件帐户,但有许多 Gmail 地址被使用。 其中许多似乎很常见的一件事是名字和姓氏相同,例如:“Donaldpat Donaldpat”。 我将如何 ...

8 SQL查询,用于按上一条消息的顺序获取消息用户

我有一个SQL查询,该查询从我的用户表中选择已向选定用户发送消息或从中接收消息的用户(我的消息表中的发件人ID或收件人ID)。 查询如下: 鉴于sentAt列是消息的时间戳,如何按发送最新消息的用户的顺序对返回进行排序。 我试图将ORDER BY sentAt DESC追加到子查 ...

2018-04-22 19:11:24 1 37   mysql/ sql
9 使用日期()选择Minutos之前的在线用户的SQL查询

嗨,我找到了一个教程来学习如何管理注册登录,他使用的是Mysql,但是我已经对mysqli进行了更改,将来我将更改为PDO。 但我也想学习其他东西 http://gigaspartan.com/2010/11/26/how-to-build-a-full-featured-login-s ...

2013-10-26 22:55:00 1 228   php/ sql
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM