我有一个数据库,每集有一行,包含人物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
答案 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;