【发布时间】:2021-10-07 00:16:09
【问题描述】:
我有一个表格,可以准确地指定每个员工在特定办公室的日期和时间。
EmployeeTable 看起来像这样:
| id | EmployeeID | DateP | TimeP |
|---|---|---|---|
| 1 | 11111 | 1397/01/02 | 01:30 |
| 2 | 11111 | 1398/05/09 | 05:30 |
| 3 | 11111 | 1398/06/07 | 05:10 |
| 4 | 22222 | 1398/08/09 | 06:12 |
| 5 | 22222 | 1399/02/01 | 07:15 |
| 6 | 11111 | 1399/07/02 | 08:51 |
| 7 | 11111 | 1399/08/06 | 12:20 |
| 8 | 33333 | 1399/09/04 | 20:01 |
| 9 | 33333 | 1399/12/08 | 22:05 |
| 10 | 33333 | 1400/01/01 | 23:11 |
| 11 | 33333 | 1400/02/05 | 14:10 |
| 12 | 22222 | 1400/04/05 | 16:25 |
我想准确地选择每个员工在办公室时的最小和最大日期和时间:
| id | EmployeeID | MinDateP | TimeMinDateP | MaxDateP | TimeMaxDateP |
|---|---|---|---|---|---|
| 1 | 11111 | 1397/01/02 | 01:30 | 1398/06/07 | 05:10 |
| 2 | 22222 | 1398/08/09 | 06:12 | 1399/02/01 | 07:15 |
| 3 | 11111 | 1399/07/02 | 08:51 | 1399/08/06 | 12:20 |
| 4 | 33333 | 1399/09/04 | 20:01 | 1400/02/05 | 14:10 |
| 5 | 22222 | 1400/04/05 | 16:25 | 1400/04/05 | 16:25 |
我的SQL代码是:
with tab1 as
(
select *
from EmployeeTable
), tab2 as
(
select
t1.*,
case when lag(t1.EmployeeID) over(order by t1.id) is null then 1
when lag(t1.EmployeeID) over(order by t1.id) = t1.EmployeeID then 0
else 1
end lg
from tab1 t1
)
, tab3 as (
select t1.*,
sum(t1.lg) over(order by t1.id) grp
from tab2 t1
)
select t1.EmployeeID,
min(t1.DateP) as min,
TimeP,
max(t1.DateP)as max,
TimeP
from tab3 t1
group by t1.EmployeeID, t1.grp
但上面的代码有错误。 每个人都可以帮助我吗?
【问题讨论】:
-
如果您遇到错误,您需要发布错误!
-
为什么将日期和时间存储在不同的列中?
标签: sql sql-server tsql