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条记录!