`

一个关于时间的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.想要得到数据如下:

即得到指定Dept(A)下的所有Emp(zhangsan,ww)AttTime记录,并按每个人分组显示,求出每个人每天的最大时间和最小时间,

没有记录的日期用空的补全。

 

AttDate      minAttTime    maxAttTime Emp Dept

<chsdate w:st="on" year="2008" month="8" day="2" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-02</span></chsdate>    6:45        18:20      zhangsan  A

<chsdate w:st="on" year="2008" month="8" day="3" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-03</span></chsdate>    null          null      zhangsan  A

<chsdate w:st="on" year="2008" month="8" day="4" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-04</span></chsdate>    null          null      zhangsan  A

<chsdate w:st="on" year="2008" month="8" day="5" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-05</span></chsdate>    null          null      zhangsan  A

<chsdate w:st="on" year="2008" month="8" day="6" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-06</span></chsdate>    null          null      zhangsan  A

<chsdate w:st="on" year="2008" month="8" day="7" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-07</span></chsdate>    null          null      zhangsan  A

<chsdate w:st="on" year="2008" month="8" day="8" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-08</span></chsdate>    7:15          19:12    zhangsan  A

 

<chsdate w:st="on" year="2008" month="8" day="1" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-01</span></chsdate>    6:41          17:20      ww      A

<chsdate w:st="on" year="2008" month="8" day="2" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-02</span></chsdate>    null          null      ww      A

<chsdate w:st="on" year="2008" month="8" day="3" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-03</span></chsdate>    null          null      ww      A

<chsdate w:st="on" year="2008" month="8" day="4" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-04</span></chsdate>    null          null      ww      A

<chsdate w:st="on" year="2008" month="8" day="5" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-05</span></chsdate>    null          null        ww      A

<chsdate w:st="on" year="2008" month="8" day="6" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-06</span></chsdate>    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 A.ID,B.Dept,B.Emp,DATEADD(day,A.ID,B.MinAttTime) AS AttTime

      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 <place w:st="on"><city w:st="on">AttRecords</city><state w:st="on"><span style="color: blue">AS</span></state></place> 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;

问下这个查询如果用linqtosql直接对AttRecords查询如何才能得到我想要的数据呢?

分享到:
评论

相关推荐

    分组计算[按时间]通用[sql分组;C#分组]

    - `DefaultView.ToTable(true, "RECORDDT")`用于根据`RECORDDT`字段对数据进行排序,并创建一个新的数据表`dtS`。 - 通过循环遍历`dtS`中的每一行,并使用`Select()`方法筛选出符合日期条件的数据行。 - 对筛选出的...

    sql查询和排序

    在Oracle 10g中,我们还可以使用Sql*Plus工具来执行这些SQL语句,这是一个命令行接口,提供了丰富的交互式查询和脚本执行功能。通过熟练掌握这些操作,你可以更高效地管理和分析数据库中的数据。 总的来说,理解并...

    SQL按月分组.txt

    根据提供的文件信息,本文将详细解释如何在SQL中实现按月份进行数据分组,并通过一个具体实例来加深理解。此方法对于需要分析时间序列数据、尤其是销售数据分析的应用场景非常有用。 ### SQL按月分组的核心概念 ##...

    76当我们在SQL里进行分组的时候,如何才能使用索引?.pdf

    数据库索引设计的一个重要方面是理解查询的执行计划和原理,以及如何针对这些信息进行深度的SQL调优。比如,考虑索引的选择性、索引覆盖以及如何避免查询中的全表扫描等。 对于更新操作,如INSERT、UPDATE和DELETE...

    SQL高级实例-模糊查询-分组随机查询-转换

    `GROUP BY`语句允许我们根据一个或多个列对数据进行分组,然后使用聚合函数如`COUNT`、`SUM`、`AVG`、`MIN`和`MAX`来计算每组的总和、平均值等信息。例如,`SELECT department, COUNT(*) FROM employees GROUP BY ...

    SQL分组排序去重复的小实例

    在这个“SQL分组排序去重复的小实例”中,我们将深入理解如何结合这三个概念来优化数据检索。 首先,我们要明白`GROUP BY`语句的作用。在SQL中,`GROUP BY`用于将数据表中的数据根据一个或多个列进行分组。当你想对...

    sql语句万能生成器,sql语句,sql语句生成

    在压缩包文件"sql_ok"中,可能包含了这样一个工具的安装程序或使用教程,可以帮助你开始探索和利用SQL语句生成器的便利性。 总之,SQL语句生成器是数据库开发者的得力助手,它能简化SQL编写,提高代码质量,降低...

    SQL争霸赛试题及答案

    最后一份文件"SQL争霸赛.sql"可能是练习用的数据库脚本,参赛者可以运行这些脚本来创建一个测试环境,以便在其中试验他们的SQL查询。这个环境可以帮助他们验证解决方案的正确性,并且可以在不改变实际比赛数据的情况...

    数据库sql语句按时间查询全部详解

    除了以上介绍的时间相关查询外,还可以执行其他常见的SQL操作,比如分组、排序等。例如: 1. **统计每个产品ID的商品数量**: ```sql SELECT ysg_pid, SUM(ysg_count) FROM ys_tb_goodsorder GROUP BY ysg_pid ...

    sql学习笔记 常见问题总结

    2. GROUP BY:用于将数据按一个或多个列进行分组,常与聚合函数一起使用。例如,`SELECT column1, COUNT(*) FROM table GROUP BY column1`按column1分组并计数。 3. HAVING:与WHERE类似,但用于筛选GROUP BY后的...

    经典SQL脚本大全

    │ 得到一个字符串在另一个字符串中出现的次数.sql │ 数字转换成十六进制.sql │ 比较第一与第二个字符串,是否有连续的5个字符相同.sql │ 生成查询的模糊匹配字符串.sql │ 简繁转换.sql │ 统计一个表中某个字符...

    SQL_92和SQL_2003标准

    1. **窗口函数**:添加了窗口函数,如ROW_NUMBER(), RANK(), DENSE_RANK()等,使得在分组数据时可以进行更复杂的数据分析和排序。 2. **游标改进**:改进了游标的处理,支持在存储过程中更灵活地控制游标的行为。 3....

    Mysql利用group by分组排序

    本文将深入探讨Mysql中`GROUP BY`的分组排序功能,并通过一个实际的例子来说明其工作原理。 首先,`GROUP BY`的基本用法是在查询中对特定列进行分组,以便对每个分组应用聚合函数,如`COUNT()`, `SUM()`, `AVG()`, ...

    关于SQL教程的简单教程

    本教程旨在提供一个简洁明了的SQL学习指南,帮助初学者快速掌握基本概念和常用命令。 一、SQL概述 SQL起源于1970年代,由IBM的研究员开发,其设计目标是为了更方便地操作关系型数据库。现在,SQL已经成为全球数据...

    Oracle SQL 官方文档

    包括基本的查询构造、数据过滤、排序、分组、聚合函数以及如何处理日期和时间等。 学习这些官方文档可以帮助开发者深入理解Oracle SQL的全貌,有效编写高效的查询,设计和实施复杂的数据库解决方案。无论是初学者...

    21天迅速学会sql(比较完整的sql学习手册)

    - **使用视图**:视图可以看作是一个虚拟表,它保存了SQL查询的结果,便于简化复杂的查询操作。 - **列的重命名**:通过AS关键字重命名视图中的列名,使其更具可读性。 - **SQL对视图的处理过程**:解释了SQL引擎...

    工资发放日期关于payday的三个sql语句

    9. **视图(View)**:如果`payday.sql`创建了一个视图,那可能是为了简化复杂的查询,或者为用户提供一个定制的查看工资数据的界面。 10. **索引优化**:考虑到效率,可能在与`payday`相关的列上创建了索引,以...

    SQL北大青鸟课后作业

    4. 排序与分组:ORDER BY和GROUP BY子句分别用于排序结果和按特定列进行分组。可能的作业会要求对查询结果进行升序或降序排列,或者计算每个组的总和、平均值等统计信息。 5. 聚合函数:SUM、AVG、MAX和MIN是常见的...

    sql大全 sql大全

    视图是从一个或多个表中选择出数据的虚拟表,它不存储实际数据,但可以提供简化查询的接口。索引用于加速数据检索,通过创建唯一或非唯一的索引,可以显著提升查询速度。 `www.pudn.com.txt`和`good-ebook`可能是...

    图解SQL数据库语言轻松入门.pptx

    SQL数据类型是SQL数据库语言的另一个重要组成部分,包括数值类型、字符类型、日期和时间类型等。本书第三章介绍了SQL中的各种数据类型,包括数值类型、字符类型、日期和时间类型等。还讲解了各种运算符和函数,如...

Global site tag (gtag.js) - Google Analytics