人与剧集

时间:2018-04-16 13:51:27

标签: sql sql-server

我有一个数据库,每集有一行,包含人物ID,开始和结束日期,一个人可以有多个剧集,剧集可以重叠。我试图使用一个查询只在每个人的行上放置一个标志,即使该人的所有行都符合标准。这可能吗?

因此,例如,Joyce在01/01/18和01/04/18之间有5个不同的剧集,其中一些重叠。我正在寻找所有在01/02/18和01/03/18之间播放的人,​​这是乔伊斯的3集,但我只想算她一次。

我正在使用查询,因此无需在此实例中声明和设置。

示例代码

     select 
         startdate,
         enddate,
         id,
         case  
            when startdate <= '01/03/18'
            and (enddate is null or enddate >= '01/02/18')
            then 1 else 0 end
     from 
         table 

这段代码有效,但它会收集每一集,而不仅仅是每一集都有一集。

表格的例子

   id   startdate    enddate
   1     01/01/18    31/01/18
   1     01/02/18    22/02/18
   1     12/01/18    25/03/18
   1     20/02/18    29/03/18  

预期的列输出

     id    startdate    enddate       uniqueflag   
     1     01/01/18    31/01/18          1
     1     01/02/18    22/02/18          0
     1     12/01/18    25/03/18          0
     1     20/02/18    29/03/18          0

这表明第一行符合条件,因此无需查看该ID的其他行,因此请转到下一个ID。我想我想要它做的是检查id,然后检查开始和结束日期是否在标准中,如果它们是1然后移动到下一个id,如果不是那么0并继续检查该id,直到一个符合标准或耗尽所有ID。

非常感谢任何帮助。

TIA

1 个答案:

答案 0 :(得分:2)

您缺少日期常量周围的单引号。通常情况下,我会投票结束作为印刷错误。但是,在这种情况下,我想强调您应该使用ISO / ANSI标准格式:

select startdate, enddate, id,
       (case when startdate <= '2018-01-03' and
                  (enddate is null or enddate >= '2018-01-02')
             then 1 else 0
        end)
from table ;

如果您只需要每个ID一行,那么您需要group by。我猜:

select id,
       max(case when startdate <= '2018-01-03' and
                  (enddate is null or enddate >= '2018-01-02')
             then 1 else 0
            end)
from table
group by id;