Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql查询-生成;地段;具有相同ID的每组N个项目的列表上的编号_Sql_Sql Server - Fatal编程技术网

Sql查询-生成;地段;具有相同ID的每组N个项目的列表上的编号

Sql查询-生成;地段;具有相同ID的每组N个项目的列表上的编号,sql,sql-server,Sql,Sql Server,我遇到了一种情况,我需要写一个查询,但我不知道什么是最好的路线 假设我有这样的数据: +------------+-------------------+ | EmployeeID | ProjectStartDate | +------------+-------------------+ | 1 | 01/01/2017 | | 1 | 02/02/2017 | | 1 | 03/03/2017

我遇到了一种情况,我需要写一个查询,但我不知道什么是最好的路线

假设我有这样的数据:

+------------+-------------------+
| EmployeeID |  ProjectStartDate |
+------------+-------------------+
| 1          |  01/01/2017       |
| 1          |  02/02/2017       |
| 1          |  03/03/2017       |
| 1          |  04/04/2017       |
| 1          |  05/05/2017       |
| 1          |  06/06/2017       |
| 1          |  07/07/2017       |
| 2          |  01/01/2017       |
| 2          |  02/02/2017       |
| 2          |  03/03/2017       |
| 2          |  04/04/2017       |
+------------+-------------------+
+------------+-------------+------------------+
| LotNumber  | EmployeeId  | ProjectStartDate |
+------------+-------------+------------------+
| 1          | 1           | 01/01/2017       |
| 1          | 1           | 02/02/2017       |
| 1          | 1           | 03/03/2017       |
| 1          | 1           | 04/04/2017       |
| 1          | 1           | 05/05/2017       |
+------------+-------------+------------------+
| 2          | 1           | 06/06/2017       |
| 2          | 1           | 07/07/2017       |
+------------+-------------+------------------+
| 1          | 2           | 01/01/2017       |
| 1          | 2           | 02/02/2017       |
| 1          | 2           | 03/03/2017       |
| 1          | 2           | 04/04/2017       |
+------------+-------------+------------------+
我需要为每个员工生成项目“批次”,但是批次有一个与每组N个(这里假设为5个)项目相关联的批次号。因此,我需要一个查询,可以按EmployeeID分组,按ProjectStartDate排序,然后将每个员工的结果动态分组为5组,为每个组分配一个增量计数。所以最终的结果是这样的:

+------------+-------------------+
| EmployeeID |  ProjectStartDate |
+------------+-------------------+
| 1          |  01/01/2017       |
| 1          |  02/02/2017       |
| 1          |  03/03/2017       |
| 1          |  04/04/2017       |
| 1          |  05/05/2017       |
| 1          |  06/06/2017       |
| 1          |  07/07/2017       |
| 2          |  01/01/2017       |
| 2          |  02/02/2017       |
| 2          |  03/03/2017       |
| 2          |  04/04/2017       |
+------------+-------------------+
+------------+-------------+------------------+
| LotNumber  | EmployeeId  | ProjectStartDate |
+------------+-------------+------------------+
| 1          | 1           | 01/01/2017       |
| 1          | 1           | 02/02/2017       |
| 1          | 1           | 03/03/2017       |
| 1          | 1           | 04/04/2017       |
| 1          | 1           | 05/05/2017       |
+------------+-------------+------------------+
| 2          | 1           | 06/06/2017       |
| 2          | 1           | 07/07/2017       |
+------------+-------------+------------------+
| 1          | 2           | 01/01/2017       |
| 1          | 2           | 02/02/2017       |
| 1          | 2           | 03/03/2017       |
| 1          | 2           | 04/04/2017       |
+------------+-------------+------------------+
通常情况下,我只会为批次创建一个表,但批次号可以动态更改,因为它们与最早日期生成的第一批批次的日期不符。因此,添加或删除项目将改变之后的每个批号


有没有人想到一种有效的方法来做到这一点?

行数和整数除法的组合应该可以:

WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BT ProjectStartDate)
    FROM dbo.YourTable
)
SELECT  (RN -1 )/5 + 1 LotNumber,
        EmployeeID,
        ProjectStartDate
FROM CTE
;

感谢您提供如此简单、优雅的解决方案!查询在不到一秒钟的时间内运行了100000条记录!