# 一个关于时间的SQL分组排序问题

1. 我有一张表如下：

AttTime(datetime)        Emp(nvarchar)            Dept(nvarchar)

2008-08-02 6:45               zhangsan                   A

2008-08-02 18:20             zhangsan                    A

2008-08-02 11:22             zhangsan                    A

2008-08-02 18:20             zhangsan                    A

2008-08-08 7:15               zhangsan                    A

2008-08-08 19:12             zhangsan                    A

2008-08-01 6:41              ww                              A

2008-08-01 8:41              ww                              A

2008-08-01 17:20            ww                              A

2008-08-06 7:11             ww                              A

2008-08-06 18:12           ww                              A

2008-08-04 8:13              lisi                              B

2.想要得到数据如下：

AttDate      minAttTime    maxAttTime Emp Dept

2008-08-02    6:45        18:20      zhangsan  A

2008-08-03    null          null      zhangsan  A

2008-08-04    null          null      zhangsan  A

2008-08-05    null          null      zhangsan  A

2008-08-06    null          null      zhangsan  A

2008-08-07    null          null      zhangsan  A

2008-08-08    7:15          19:12    zhangsan  A

2008-08-01    6:41          17:20      ww      A

2008-08-02    null          null      ww      A

2008-08-03    null          null      ww      A

2008-08-04    null          null      ww      A

2008-08-05    null          null        ww      A

2008-08-06    7:11          18:12      ww      A

3.答案如下：

--> 生成测试数据: @AttRecords

CREATE TABLE AttRecords(AttTime DATETIME,Emp VARCHAR(8),Dept VARCHAR(1))

INSERT INTO AttRecords

SELECT '2008-08-02 6:45','zhangsan','A' UNION ALL

SELECT '2008-08-02 18:20','zhangsan','A' UNION ALL

SELECT '2008-08-02 11:22','zhangsan','A' UNION ALL

SELECT '2008-08-02 18:20','zhangsan','A' UNION ALL

SELECT '2008-08-08 7:15','zhangsan','A' UNION ALL

SELECT '2008-08-08 19:12','zhangsan','A' UNION ALL

SELECT '2008-08-01 6:41','ww','A' UNION ALL

SELECT '2008-08-01 8:41','ww','A' UNION ALL

SELECT '2008-08-01 17:20','ww','A' UNION ALL

SELECT '2008-08-06 7:11','ww','A' UNION ALL

SELECT '2008-08-06 18:12','ww','A' UNION ALL

SELECT '2008-08-04 8:13','lisi','B'

--SQL查询如下:

--在实际中.应该在数据库中建立一个序号表来代替master.dbo.spt_values

GO

CREATE VIEW dbo.v_Test

AS

SELECT

A.Emp,A.Dept,

CONVERT(VARCHAR(10),A.AttTime,120) AS AttTime,

CONVERT(VARCHAR(10),MIN(B.AttTime),108) AS MinAttTime,

CONVERT(VARCHAR(10),MAX(B.AttTime),108) AS MaxAttTime

FROM (SELECT number AS ID FROM master.dbo.spt_values WHERE type = 'p') AS A

CROSS JOIN (SELECT Dept,Emp,MIN(AttTime) AS MinAttTime,MAX(AttTime) AS MaxATtTime

FROM AttRecords WHERE Dept = 'A' GROUP BY Dept,Emp ) AS B

WHERE DATEADD(day,A.ID,B.MinAttTime) <= B.MaxAttTime) AS A

LEFT JOIN AttRecords AS B

ON DATEDIFF(day,B.AttTime,A.AttTime) = 0 AND A.Emp = B.Emp AND A.Dept = B.Dept

GROUP BY A.Dept,A.Emp,CONVERT(VARCHAR(10),A.AttTime,120);

GO

SELECT * FROM dbo.v_Test ORDER BY Dept,Emp,AttTime;

GO

DROP VIEW dbo.v_Test;

DROP TABLE AttRecords;

|
4月前
|
SQL
sql server模糊查询、分组
sql server模糊查询、分组
|
2月前
|
SQL 数据挖掘 数据库
SQL分组函数
【7月更文挑战第24天】SQL分组函数
19 1
|
25天前
|
SQL
SQL SERVER数据分组后取第一条数据——PARTITION BY
SQL SERVER数据分组后取第一条数据——PARTITION BY
61 0
|
2月前
|
SQL 数据库
【SQL】已解决：SQL分组去重并合并相同数据
【SQL】已解决：SQL分组去重并合并相同数据
50 1
|
3月前
|
SQL
sql语句按指定某个字段分组后删除重复数据只保留id最小/最大的一条数据
sql语句按指定某个字段分组后删除重复数据只保留id最小/最大的一条数据
64 0
|
4月前
|
SQL HIVE
【Hive SQL 每日一题】分组排名取值

44 1
|
4月前
|
SQL 关系型数据库 MySQL

48 5
|
3月前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL（3）-DQL（基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习）
MySQL数据库——SQL（3）-DQL（基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习）
46 0
|
3月前
|
SQL 数据库

19 0
|
4月前
T-sql 高级查询（ 5*函数 联接 分组 子查询）
T-sql 高级查询（ 5*函数 联接 分组 子查询）
38 1

DDNS