我需要一个 SQL 查询来检查一个人是否在一年中连续两周处于事件状态。
例如,
Table1:
Name | Activity | Date
Name1|Basketball| 08-08-2014
Name2|Volleyball| 08-09-2014
Name3|None | 08-10-2014
Name1|Tennis | 08-14-2014
我想检索 Name1,因为该人在一年中连续两周处于事件状态。
到目前为止,这是我的查询:
SELECT DISTINCT Name
FROM Table1
Where YEAR(Date) = 2014 AND
Activity NOT 'None' AND
这是我需要连续两周检查事件的逻辑的地方。一周可以用7到14天来形容。我正在使用 MYSQL。
最佳答案
我有意避免在 where 子句中使用 YEAR(Date
),并建议您也这样做。在多行数据上使用函数来满足单个标准 (2014) 对我来说毫无意义,而且它会破坏索引的有效性(请参阅维基百科上的“sargable”)。恕我直言,仅按日期范围定义过滤器会更容易。
我使用了相关子查询来派生 nxt_date
,它可能无法很好地扩展,但总体性能很可能取决于您的索引。
select distinct
name
from (
select
t.name
, t.Activity
, t.`Date`
, (
select min(table1.`Date`) from table1
where t.name = table1.name
and table1.Activity <> 'None'
and table1.`Date` > t.`Date`
) as nxt_date
from table1 as t
where ( t.`Date` >= '2014-01-01' and t.`Date` < '2015-01-01' )
and t.Activity <> 'None'
) as sq
where datediff(sq.nxt_date, sq.`Date`) <= 14
;
关于mysql - 按周检查的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25160423/