Sql server SQL Server:用于选择没有挂起作业状态的员工的查询

Sql server SQL Server:用于选择没有挂起作业状态的员工的查询,sql-server,Sql Server,我们有三张表:员工、工作和工作历史 在这里,我们需要选择没有任何状态为“待定”的工作的员工姓名和最新完成时间 雇员 | Employee Name | Job Name | +---------------+----------+ | Jane | job1 | | Jane | job2 | | Jane | job3 | | Alex | job4 | | Alex |

我们有三张表:员工、工作和工作历史

在这里,我们需要选择没有任何状态为“待定”的工作的员工姓名和最新完成时间

雇员

| Employee Name | Job Name |
+---------------+----------+
| Jane          | job1     |
| Jane          | job2     |
| Jane          | job3     |
| Alex          | job4     |
| Alex          | job5     |
| John          | job6     |
工作

工作经历

| Job Name | Completion time     |
+----------+---------------------+
| job1     | 2019-08-27 04:50:25 |
| job2     | 2019-08-30 17:45:34 |
| job3     | 2019-09-12 09:53:20 |
| job4     | 2019-08-27 04:50:25 |
| job5     | 2019-09-07 20:57:25 |
| job6     | 2019-10-30 07:45:34 |
预期结果

| Alex | 2019-09-07 20:57:25 |
| John | 2019-10-30 07:45:34 |
我的问题是:

选择 e、 员工姓名,h.完成时间 从…起 雇员 左外连接 b上的作业b。作业名称=e.作业名称和b.状态未处于“待定”状态 左外连接 作业历史记录h ON h.作业名称=e.作业名称 和h.完成时间=选择前1个h.完成时间 按h.完成时间说明订购 MS SQL Server 2017架构设置:

问题1:


这看起来像是一个规范,而不是一个问题——您已经尝试过解决这个问题了吗?它看起来像是一个带有一些连接的非常简单的SQL查询。欢迎使用堆栈溢出!你似乎在要求这个社区为你做家庭作业。我们不是这样做的。若要了解更多有关此社区的信息以及我们如何帮助您,请从和阅读及其链接的资源开始。您的目标是什么,技术负责人?似乎您需要使用max或某些窗口功能(如row_number)从项目中获取最新的日期时间值。如果希望看到完成日期,则使用外部联接没有什么意义。一个历史表每个项目有一行,这有点奇怪-你把它简化了吗?还是你给那张桌子起错名字了?如果某个员工没有工作,该员工是否会出现在您的结果中。
| Alex | 2019-09-07 20:57:25 |
| John | 2019-10-30 07:45:34 |
CREATE TABLE Employees(EmployeeName varchar(20),JobName varchar(20))
CREATE TABLE [Job] (JobName varchar(20), [Status] varchar(20))
CREATE TABLE JobHistory(JobName varchar(20), CompletionTime Date)

INSERT INTO Employees (EmployeeName,JobName) VALUES ('Jane','job1'),('Jane','job2')
,('Jane','job3'),('Alex','job4'),('Alex','job5'),('John','job6')

INSERT INTO [Job](JobName,[Status]) VALUES ('job1','Completed'),('job2','Pending')
,('job3','Completed'),('job4','Completed'),('job5','Completed'),('job6','Completed')

INSERT INTO JobHistory(JobName,CompletionTime) VALUES ('job1','2019-08-27'),
('job2','2019-08-30'),('job3','2019-09-12'),('job4','2019-08-27'),
('job5','2019-09-07'),('job6','2019-10-30')
WITH CTE AS (
SELECT  E.EmployeeName,MAX(J.[Status]) AS [Status] ,MAX(H.CompletionTime) AS CompletionTime FROM Employees AS E
LEFT JOIN [Job] AS J ON E.JobName = J.JobName
LEFT JOIN JobHistory AS H ON H.JobName=J.JobName 
GROUP BY E.EmployeeName)

SELECT C.* FROM CTE AS C

INNER JOIN 
    (SELECT EmployeeName
     FROM Employees AS E
     INNER JOIN Job AS J ON E.JobName=J.JobName
     WHERE [Status] = 'Pending') AS T ON T.EmployeeName <> C.EmployeeName
| EmployeeName |    Status | CompletionTime |
|--------------|-----------|----------------|
|         Alex | Completed |     2019-09-07 |
|         John | Completed |     2019-10-30 |