2017-07-05 63 views
0

的这将是中介输出我需要更新:找到所有分组的记录,其中一个记录是不是某种类型的记录

Id1, Id2, Type, Date 
1, 2, test, 2010-10-10 
1, 3, stage, 2010-05-05 
1, 2, stage, 2010-12-12 
1, 3, test, 2010-04-04 
1, 3, prod, 2010-12-31 

从这一点来说,我想知道有多少分组(ID1,ID2)记录在之后确实存在Type ='test'的记录。

对于上述我会得到这个最终输出:

Id1, Id2, Count 
1, 2, 1 
1, 3, 2 

那会是什么SQL查询?

用例是要找到所有这些谁没有把它比TYPE =“测试”

+0

我不明白。当你说测试时,你是指日期2010-10-10或2010-04-04?看看您的示例输出,除了测试之外,你是否想要计算一切吗? –

回答

0

你必须让日期为“测试”类型的值对应的ID1和ID2后一阶段的记录然后进行记录计数。就像这样:

drop table if exists dbo.LaterThan; 

create table dbo.LaterThan (
    Id1 int 
    , Id2 int 
    , Type varchar(100) 
    , Date date 
); 

insert into dbo.LaterThan (Id1, Id2, Type, Date) 
values (1, 2, 'test', '20101010') 
    , (1, 3, 'stage', '20100505') 
    , (1, 2, 'stage', '20101212') 
    , (1, 3, 'test', '20100404') 
    , (1, 3, 'prod', '201') 

select 
    lt.Id1 
    , lt.Id2 
    , count(case when lt.Date >= test.Date and lt.Type <> 'test' then 1 else null end) as Cnt 
from dbo.LaterThan lt 
    outer apply (
      select 
       top (1) 
       tlt.Date 
      from dbo.LaterThan tlt 
      where lt.ID1 = tlt.Id1 
       and lt.ID2 = tlt.Id2 
       and tlt.Type = 'test' 
    ) test 
group by lt.Id1, lt.Id2 
0
SELECT x.Id1, x.Id2, x.[Date], 
     CountAfter = (
      SELECT COUNT(*) FROM dbo.Table1 AS y 
      WHERE x.Id1=y.Id1 AND x.Id2=y.Id2 
      AND y.[Date]>x.[Date]) -- After 
FROM dbo.Table1 AS x 
WHERE x.[Type]='test' 

注:我认为每一个{Id1, Id2}对值只有一行与Type='test'

编辑1:如果你想CountAfter = 0然后

SELECT x.Id1, x.Id2, x.[Date] 
FROM dbo.Table1 AS x 
WHERE x.[Type]='test' 
AND NOT EXISTS (
    SELECT * FROM dbo.Table1 AS y 
    WHERE x.Id1=y.Id1 AND x.Id2=y.Id2 
    AND y.[Date]>x.[Date]) 

或过滤所有行(但不是最佳的解决方案)

SELECT ... 
FROM (
... insert main query ... 
) AS mq 
WHERE mq.CountAfter = 0 
+0

任何想法,我仍然可以过滤到计数为零的条目? – Pascal

+0

@帕斯卡尔:编辑1更新。 –

0

我想查询会,

SELECT Id1, Id2, count(Id1) from <table_name> where Type = 'test' group by Id1, Id2; 
0

你可以这样做:

SELECT 
    t.Id1, 
    t.Id2, 
    COUNT(*) AS Count 
FROM (SELECT Id1, Id2, Date FROM Table WHERE TYPE = 'test') t 
LEFT JOIN Table tt 
    ON tt.Id1 = t.Id1 AND tt.Id2 = t.Id2 AND t.Date <= tt.Date 
    AND tt.Type <> 'Test' 
GROUP BY t.Id1, t.Id2 

例子:

DECLARE @table TABLE (Id1 int, Id2 int, [Type] varchar(10),[Date] date) 
INSERT INTO @table VALUES (1, 2, 'test', '2010-10-10'), 
(1, 3, 'stage', '2010-05-05'), 
(1, 2, 'stage', '2010-12-12'), 
(1, 3, 'test', '2010-04-04'), 
(1, 3, 'prod', '2010-12-31') 

SELECT 
    t.Id1, 
    t.Id2, 
    COUNT(*) AS Count 
FROM (SELECT Id1, Id2, Date FROM @Table WHERE TYPE = 'test') t 
LEFT JOIN @Table tt 
    ON tt.Id1 = t.Id1 AND tt.Id2 = t.Id2 AND t.Date <= tt.Date 
    AND tt.Type <> 'Test' 
GROUP BY t.Id1, t.Id2 
0

有可能是类似的(ID1,ID2)记录不同日期。 因此,如果您只需要使用此(Id1,Id2)对的记录进行计数,而不考虑日期字段,那么这将适用于您。

SELECT T.Id1,T.Id2,COUNT(*) AS Count 
FROM 
    (SELECT Id1, Id2, Date 
    FROM TABLENAME 
    WHERE TYPE = 'test') AS T 
GROUP BY 
T.Id1, T.Id2 

否则,您需要在GROUP BY子句中添加Date字段。

相关问题