sql - 无在职残疾用户的SQL查询
问题描述
与我们所有的用户和他们的工作有一张桌子。
当某人重新就业时,将为该就业期间添加一个新行。用户名将始终相同。
试图找出最好的方法来找出哪些用户被禁用并且没有积极的工作。数据库是 SQL Server 2016。
示例表:
| username | name | active | enddate
+-----------+-----------+--------+----------
| 1111 | Jane Doe | 1 | 1/3/2022
| 1111 | Jane Doe | 0 | 1/2/2018
| 1112 | Bob Doe | 1 | NULL
| 1113 | James Doe | 0 | 1/3/2018
| 1114 | Ray Doe | 1 | NULL
| 1114 | Ray Doe | 0 | 2/2/2019
| 1115 | Emma Doe | 1 | NULL
| 1116 | Sara Doe | 0 | 3/4/2016
| 1116 | Sara Doe | 0 | 4/5/2019
理想情况下,即使他们有几份工作已经结束,我也希望每个用户名只获得一行。
所以一个查询会得到一个包含用户 1113 和 1116 的两行的列表。
解决方案
与这个答案相比,我发现其他答案很难阅读(或没有给出你所要求的):
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())))
但这是个人口味。这将搜索今天没有任何活动记录的所有禁用用户。
只需确保您的enddate
列实际上是DATE
而不是VARCHAR
,因为它可能会给您带来转换问题。
如果您想显示所有列,但每个用户名显示一次,那么我们将不得不重新加入禁用记录。CROSS APPLY
我们可以使用with TOP N
+来控制行数ORDER BY
:
;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
推荐阅读
- mysql - 有什么方法可以显示 MySQL 表锁定历史
- javascript - 当我在本地运行它时,我的引导模式正在工作,但是当我通过 git-hub 运行它时它不会打开?
- sql-server - 如何在单个存储过程中创建多个表和存储过程
- php - 会话变量或新的 sql 查询
- ui-automation - Web 服务请求:Katalon 中的错误,但在 Postman 中工作
- c# - 简单场景中的 HttpPost 将 null 传递给 Controller 方法
- design-patterns - 基于过去二进制数据的模式预测下一个二进制结果的合适方法
- c# - 多边形中的点,包括 c# 中带有边距的边缘情况
- postgresql - 检查 `RECORD` 变量是否已初始化
- python - 当我在 Django 中获取 Object 中的所有数据时,得到类似''str' object has no attribute 'values'这样的错误”