5 sql sql-server sql-server-2005
数据库:MS SQL 2005
表:
EmployeeNumber | EntryDate | 状态
样本数据:
200 | 3/1/2009 | P
200 | 2009年3月2日| A
200 | 2009年3月3日| A
201 | 3/1/2009 | A
201 | 2009年3月2日| P
在存在P的情况下,A不存在.我已尝试过row_number.但它不会产生我期望的序列.
对于上述数据,我期望的序列是1 1 2 1 1
SELECT EmployeeNumber, EntryDate,Status
ROW_NUMBER() OVER (
PARTITION BY EmployeeNumber, Status
ORDER BY EmployeeNumber,EntryDate ) AS 'RowNumber'
FROM [Attendance]
Run Code Online (Sandbox Code Playgroud)
您应该能够使用 SQL 2005 中的 CTE 来完成此操作。窃取 Lievens 数据:
DECLARE @Attendance TABLE (EmployeeNumber INTEGER, EntryDate DATETIME, Status VARCHAR(1)) INSERT INTO @Attendance VALUES (200, '03/01/2009', 'P') 插入@Attendance VALUES (200, '03/02/2009', 'A') 插入@Attendance VALUES (200, '03/03/2009', 'A') 插入@Attendance VALUES (200, '03/04/2009', 'A') 插入@Attendance VALUES (200, '04/04/2009', 'A') 插入@Attendance VALUES (200, '04/05/2009', 'A') 插入@Attendance VALUES (201, '03/01/2009', 'A') 插入@Attendance VALUES (201, '03/02/2009', 'A') INSERT INTO @Attendance VALUES (201, '03/03/2009', 'P');
然后使用这个 CTE 来提取序列:
带日期
(
入境日期,
员工编号,
地位,
天
)
作为
(
选择
a.输入日期,
a.员工编号,
a. 状态,
1
从
@出席a
在哪里
a.EntryDate = (从@Attendance中选择MIN(EntryDate))
-- 递归
联合所有
选择
a.输入日期,
a.员工编号,
a. 状态,
CASE WHEN (a.Status = Parent.Status) THEN Parent.Days + 1 ELSE 1 END
从
@出席a
内部联接
日期父母
在
datediff(日,a.EntryDate,DateAdd(日,1,parent.EntryDate))= 0
和
a.员工编号 = 父级.员工编号
)
SELECT * FROM 日期顺序(按员工编号、条目日期)
尽管作为最后一点,该序列对我来说似乎很奇怪,但根据您的要求,可能有更好的方法来聚合数据?尽管如此,这将产生您需要的序列
| 归档时间: |
|
| 查看次数: |
2590 次 |
| 最近记录: |