2016-04-23 8 views
-1

私は以下のテーブルを持っています。私は1つのタスクを完了しない結果AssetIDが必要です。このシナリオのSQLクエリが必要です

CREATE TABLE #T(AssetId INT,TaskName varchar(100),StartTime DATE,EndTime date) 
go 

insert into #t(AssetId,TaskName,StartTime,EndTime) values(10,'task1','2016-01-11','2016-04-12')</b> 
insert into #t(AssetId,TaskName,StartTime,EndTime) values(10,'task2','2016-01-11',NULL) 
insert into #t(AssetId,TaskName,StartTime,EndTime) values(10,'task3','2016-01-11','2016-12-11')</b> 
insert into #t(AssetId,TaskName,StartTime,EndTime) values(11,'task4','2016-01-11','2016-04-12')</b> 
insert into #t(AssetId,TaskName,StartTime,EndTime) values(11,'task1','2016-01-11','2016-04-12')</b> 
insert into #t(AssetId,TaskName,StartTime,EndTime) values(11,'task2','2016-01-11',NULL)</b> 
insert into #t(AssetId,TaskName,StartTime,EndTime) values(12,'task1','2016-01-11',null)</b> 
insert into #t(AssetId,TaskName,StartTime,EndTime) values(12,'task2','2016-01-11',null)</b> 
insert into #t(AssetId,TaskName,StartTime,EndTime) values(12,'task3','2016-01-11',null)</b> 
insert into #t(AssetId,TaskName,StartTime,EndTime) values(13,'task1','2016-01-11',null)</b> 
insert into #t(AssetId,TaskName,StartTime,EndTime) values(13,'task2','2016-01-11',null)</b> 

だから、結果はあなたがassetidが必要な場合は、その後group byを使用

12 task1 11-01-2016 NULL 
12 task2 11-01-2016 NULL 
12 task3 11-01-2016 NULL 
13 task1 11-01-2016 NULL 
13 task2 11-01-2016 NULL 

答えて

2

以下のように必要があります。

select assetid 
from #t 
group by assetid 
having count(endtime) = 0; 

あなたが行をしたい場合は、ウィンドウ関数を使用します。

select t.* 
from (select t.*, count(endtime) over (partition by assetid) as cntet 
     from #t t 
    ) t 
where cntet = 0; 
2

@ Gordenの答えはまったく問題ありません。テーブルを一度スキャンするだけで、より良いクエリプランが生成される場合があります。

しかし、非常に便利なExists句をご紹介します。このような存在を使用して行うことができます。

SELECT * 
FROM #T AS a 
WHERE NOT EXISTS (SELECT 1 
        FROM #T AS b 
        WHERE a.AssetId = b.AssetId 
        AND b.EndTime IS NOT NULL) 
関連する問題