Sql 时钟相关查询逻辑
我真的需要一些帮助来解决以下场景的查询Sql 时钟相关查询逻辑,sql,sql-server,database,Sql,Sql Server,Database,我真的需要一些帮助来解决以下场景的查询 tblStaff | ESID | EID | FName | LName | +------+-----+-------+--------+ | 1 | 10 | Joe | Smith | | 2 | 10 | Dan | Jones | | 3 | 10 | Rick | Brown | | 4 | 10 | Pete | Miller | | 5 | 10 | Ken | White
tblStaff
| ESID | EID | FName | LName |
+------+-----+-------+--------+
| 1 | 10 | Joe | Smith |
| 2 | 10 | Dan | Jones |
| 3 | 10 | Rick | Brown |
| 4 | 10 | Pete | Miller |
| 5 | 10 | Ken | White |
tblStaffTime
| TCID | EID | ESID | DTIn | DTOut |
+------+-----+------+-------------------------+-------------------------+
| 1 | 10 | 1 | 2013-09-22 08:00:00.000 | 2013-09-22 17:00:00.000 |
| 2 | 10 | 1 | 2013-09-23 08:00:00.000 | NULL |
| 3 | 10 | 2 | 2013-09-23 08:00:00.000 | 2013-09-23 17:00:00.000 |
| 4 | 10 | 3 | 2013-09-22 08:00:00.000 | 2013-09-22 17:00:00.000 |
| 5 | 10 | 3 | 2013-09-23 08:00:00.000 | NULL |
我的目标是:
列出EID等于10的所有人,其中最近的DTOut不为null,或者他们在tblStaffTime中根本没有此EID的记录。换言之,EID等于10的所有员工都有一份名单,上面列出了谁准备好登记
到目前为止,我的SQL:
SELECT tblStaff.ESID AS ID,tblStaff.SFirst + CHAR(32) + tblStaff.SLast AS StaffName
FROM tblStaff
LEFT JOIN tblStaffTime ON tblStaff.ESID = tblStaffTime.ESID
WHERE tblStaff.ESID = (SELECT ESID FROM tblStaffTime WHERE EID = '10' AND ESID = tblStaffTime.ESID AND DTIn IS NOT NULL AND DTOut IS NOT NULL)
UNION ALL
SELECT tblStaff.ESID AS ID,tblStaff.SFirst + CHAR(32) + tblStaff.SLast AS StaffName
FROM tblStaff
LEFT JOIN tblStaffTime ON tblStaff.ESID = tblStaffTime.ESID
WHERE NOT EXISTS (SELECT 1 FROM tblStaffTime WHERE tblStaffTime.ESID = tblStaff.ESID) AND tblStaff.EID = '10'
ORDER BY tblStaff.SFirst + CHAR(32) + tblStaff.SLast
期望输出:
| ESID | StaffName |
+------+-------------+
| 2 | Dan Jones |
| 5 | Ken White |
| 4 | Pete Miller |
我所在的工会南部解决了我的问题,那就是让那些没有参加EID的员工来上班。我的主要问题是我的北方。我需要获取最新的DTIn,并查看该记录的DTOut是否为null,以确定它们是否应被列为已准备好输入时钟。我敢肯定,这些SQL都可以写得更干净。我现在就交给专家们处理 如果您使用的是SQL Server 2005或更高版本,则可以使用窗口函数来帮助完成此操作 左侧外部联接有助于包括没有记录的人,而order by DTIn允许我们在有记录时选择最新的时间记录
With x as (
Select
s.ESID,
s.EID,
s.FName,
s.LName,
t.DTIn,
t.DTOut,
row_number() over (partition by s.ESID, s.EID order by DTIn Desc) rn
From
tblStaff s
Left Outer Join
tblStaffTime t
On s.ESID = t.ESID and s.EID = t.EID
)
Select
x.ESID,
x.EID,
x.FName,
x.LName
From
x
Where
x.EID = 10 And
x.rn = 1 And (
x.DTIn Is Null Or -- no time records
x.DTOut IS Not Null -- latest time record has not null clock out
)
与论坛网站不同,我们不使用“感谢”或“感谢任何帮助”或签名。请参阅“。测试数据的预期结果将非常有用