这是我的表/源数据,计算在SQL Server中运行计数排除某些行
|---------------------------------------------------|
|ID | DT | DAY | ATTENDANCE |
|-------+---------------+-----------+---------------|
|89 | 2014-08-23 | NULL | 1 |
|90 | 2014-08-24 | Sunday | NULL |
|91 | 2014-08-25 | NULL | 1 |
|92 | 2014-08-26 | NULL | 1 |
|93 | 2014-08-27 | NULL | 0 |
|94 | 2014-08-28 | NULL | 1 |
|95 | 2014-08-29 | NULL | 0 |
|96 | 2014-08-30 | NULL | 1 |
|97 | 2014-08-31 | Sunday | NULL |
|98 | 2014-08-01 | NULL | 1 |
|99 | 2014-08-02 | NULL | 1 |
|100 | 2014-08-03 | NULL | 0 |
|101 | 2014-08-04 | NULL | 0 |
|102 | 2014-08-05 | NULL | 1 |
|103 | 2014-08-06 | NULL | 1 |
|104 | 2014-08-07 | Sunday | NULL |
|105 | 2014-08-08 | NULL | 1 |
|106 | 2014-08-09 | NULL | 1 |
|107 | 2014-08-10 | NULL | 1 |
|---------------------------------------------------|
我想要的结果给出。第5列[Streak]
是我正在计算的。这是根据出席人数计算的价值。在任何一天,如果[ATTENDANCE] = 0
,[Streak]
变得重置为0
|-------------------------------------------------------------|
|ID | DT | DAY | ATTENDANCE | Streak |
|-------+---------------+-----------+---------------+---------|
|89 | 2014-08-23 | NULL | 1 | 1 |
|90 | 2014-08-24 | Sunday | NULL | |
|91 | 2014-08-25 | NULL | 1 | 2 |
|92 | 2014-08-26 | NULL | 1 | 3 |
|93 | 2014-08-27 | NULL | 0 | 0 |
|94 | 2014-08-28 | NULL | 1 | 1 |
|95 | 2014-08-29 | NULL | 0 | 0 |
|96 | 2014-08-30 | NULL | 1 | 1 |
|97 | 2014-08-31 | Sunday | NULL | |
|98 | 2014-08-01 | NULL | 1 | 2 |
|99 | 2014-08-02 | NULL | 1 | 3 |
|100 | 2014-08-03 | NULL | 0 | 0 |
|101 | 2014-08-04 | NULL | 0 | 0 |
|102 | 2014-08-05 | NULL | 1 | 1 |
|103 | 2014-08-06 | NULL | 1 | 2 |
|104 | 2014-08-07 | Sunday | NULL | |
|105 | 2014-08-08 | NULL | 1 | 3 |
|106 | 2014-08-09 | NULL | 1 | 4 |
|107 | 2014-08-10 | NULL | 1 | 5 |
|-------------------------------------------------------------|
这是我到目前为止没有。对我来说,星期天也是一天增加。 任何帮助,解决它..
SQL
SELECT X.*, X.ID - LU.FROMID + 1
FROM @TAB X LEFT JOIN
(
SELECT (SELECT MIN(ID) FROM @TAB) FROMID,MIN(ID) TOID FROM @TAB WHERE ATTENDANCE = 0
UNION
SELECT A.ID FROMID,B.ID TOID
FROM (SELECT ID,ROW_NUMBER() OVER (ORDER BY ID) R FROM @TAB WHERE ATTENDANCE = 0) A CROSS JOIN
(SELECT ID,ROW_NUMBER() OVER (ORDER BY ID) R FROM @TAB WHERE ATTENDANCE = 0) B
WHERE A.R = (B.R - 1)
UNION
SELECT MAX(ID),(SELECT MAX(ID) FROM @TAB) FROM @TAB WHERE ATTENDANCE = 0
UNION
SELECT MAX(ID),MAX(ID) + 1 FROM @TAB
) LU
ON X.ID >= LU.FROMID AND X.ID < LU.TOID
测试源数据:
SET DATEFORMAT DMY
DECLARE @TAB TABLE (ID INT IDENTITY(89,1),DT DATE,DAY VARCHAR(15),ATTENDANCE BIT)
INSERT INTO @TAB VALUES
('23-08-2014',Null,1),
('24-08-2014','Sunday',Null),
('25-08-2014',Null ,1),
('26-08-2014',Null ,1),
('27-08-2014',Null ,0),
('28-08-2014',Null ,1),
('29-08-2014',Null ,0),
('30-08-2014',Null ,1),
('31-08-2014','Sunday',Null),
('01-08-2014',Null ,1),
('02-08-2014',Null ,1),
('03-08-2014',Null ,0),
('04-08-2014',Null ,1),
('05-08-2014',Null ,0),
('06-08-2014',Null ,1),
('07-08-2014','Sunday',Null),
('08-08-2014',Null ,1),
('09-08-2014',Null ,1),
('10-08-2014',Null ,1)
在此先感谢。
是否有意盟友的日期从2014-08-31到2014-08-01? – 2014-09-04 12:17:04
@GordonLinoff,这是一个错误,日期是8月之后的9月份。我将编辑它... – HHH 2014-09-04 12:19:10