我想筛选出包含TASK_START & TASK_END的所有空值的组,它将是B和D。
样本表数据
+----+-------+-------------------------+-------------------------+-------------------------+-------------------------+
| ID | STATE | ENTER_STATE | LEAVE_STATE | TASK_START | TASK_END |
+----+-------+-------------------------+-------------------------+-------------------------+-------------------------+
| A | UP | 2018-11-11 08:00:00.000 | 2018-11-11 08:30:00.000 | 2018-11-11 08:00:00.000 | 2018-11-11 08:10:00.000 |
| A | UP | 2018-11-11 09:00:00.000 | 2018-11-11 09:30:00.000 | NULL | NULL |
| A | UP | 2018-11-11 10:00:00.000 | 2018-11-11 10:30:00.000 | 2018-11-11 08:20:00.000 | 2018-11-11 08:30:00.000 |
| B | UP | 2018-11-11 08:00:00.000 | 2018-11-11 09:00:00.000 | NULL | NULL |
| B | UP | 2018-11-11 09:00:00.000 | 2018-11-11 10:00:00.000 | NULL | NULL |
| B | UP | 2018-11-11 10:20:00.000 | 2018-11-11 11:00:00.000 | NULL | NULL |
| B | UP | 2018-11-11 11:00:00.000 | 2018-11-11 12:00:00.000 | NULL | NULL |
| C | UP | 2018-11-11 08:00:00.000 | 2018-11-11 08:20:00.000 | 2018-11-11 08:15:00.000 | 2018-11-11 08:30:00.000 |
| C | UP | 2018-11-11 08:20:00.000 | 2018-11-11 08:30:00.000 | 2018-11-11 08:20:00.000 | 2018-11-11 08:35:00.000 |
| D | UP | 2018-11-11 08:00:00.000 | 2018-11-11 08:10:00.000 | NULL | NULL |
| D | UP | 2018-11-11 08:10:00.000 | 2018-11-11 09:10:00.000 | NULL | NULL |
+----+-------+-------------------------+-------------------------+-------------------------+-------------------------+发布于 2018-11-15 11:15:42
试试这个:
DECLARE @DataSource TABLE
(
[ID] CHAR(1)
,[STATE] CHAR(2)
,[ENTER_STATE] DATETIME2(0)
,[LEAVE_STATE] DATETIME2(0)
,[TASK_START] DATETIME2(0)
,[TASK_END] DATETIME2(0)
);
INSERT INTO @DataSource
VALUES ('A', 'UP', '2018-11-11 08:00:00.000', '2018-11-11 08:30:00.000', '2018-11-11 08:00:00.000', '2018-11-11 08:10:00.000')
,('A', 'UP', '2018-11-11 09:00:00.000', '2018-11-11 09:30:00.000', NULL, NULL)
,('A', 'UP', '2018-11-11 10:00:00.000', '2018-11-11 10:30:00.000', '2018-11-11 08:20:00.000', '2018-11-11 08:30:00.000')
,('B', 'UP', '2018-11-11 08:00:00.000', '2018-11-11 09:00:00.000', NULL, NULL)
,('B', 'UP', '2018-11-11 09:00:00.000', '2018-11-11 10:00:00.000', NULL, NULL)
,('B', 'UP', '2018-11-11 10:20:00.000', '2018-11-11 11:00:00.000', NULL, NULL)
,('B', 'UP', '2018-11-11 11:00:00.000', '2018-11-11 12:00:00.000', NULL, NULL)
,('C', 'UP', '2018-11-11 08:00:00.000', '2018-11-11 08:20:00.000', '2018-11-11 08:15:00.000', '2018-11-11 08:30:00.000')
,('C', 'UP', '2018-11-11 08:20:00.000', '2018-11-11 08:30:00.000', '2018-11-11 08:20:00.000', '2018-11-11 08:35:00.000')
,('D', 'UP', '2018-11-11 08:00:00.000', '2018-11-11 08:10:00.000', NULL, NULL)
,('D', 'UP', '2018-11-11 08:10:00.000', '2018-11-11 09:10:00.000', NULL, NULL);
WITH DataSource AS
(
SELECT *
,MAX([TASK_START]) OVER (PARTITION BY [ID]) AS [DateStart]
,MAX([TASK_END]) OVER (PARTITION BY [ID]) AS [DateEnd]
FROM @DataSource
)
SELECT *
FROM DataSource
WHERE NOT ([DateStart] IS NULL AND [DateEnd] IS NULL);

这样做的目的是获得每个组的最大日期(如果您愿意,也可以得到最小日期),然后,如果存在该值为NULL的行,则将其排除在外。
发布于 2018-11-15 10:47:12
您可以使用not exists:
select t.*
from table t
where not exists (select 1
from table t1
where t1.id = t.id and t1.task_start is not null and t1.task_end is not null
);其他选项将使用GROUP BY:
select id
from table t
group by id
having sum(case when task_start is not null then 1 else 0 end) = 0 and
sum(case when task_end is not null then 1 else 0 end) = 0;发布于 2018-11-15 12:09:30
我将简单地将count()与having结合使用
select id
from table t
group by id
having count(task_start) = 0 and
count(task_end) = 0;https://stackoverflow.com/questions/53317640
复制相似问题