Sql 查询具有或不具有日期约束的事件序列

Sql 查询具有或不具有日期约束的事件序列,sql,sql-server,mongodb,indexing,sequence,Sql,Sql Server,Mongodb,Indexing,Sequence,假设我有一个包含0:多个时间事件的人的数据库 PERSON TABLE: ID Person -- ------ 1 Patrick 2 Sandy EVENT TABLE: ID Event -- ----- 1 blow bubbles 2 visit SpongeBob 3 eat at the Krusty Krab PERSON EVENT TABLE: Person_ID

假设我有一个包含0:多个时间事件的人的数据库

PERSON TABLE:
ID      Person  
--      ------  
1       Patrick
2       Sandy

EVENT TABLE:
ID      Event
--      -----
1       blow bubbles
2       visit SpongeBob
3       eat at the Krusty Krab

PERSON EVENT TABLE:
Person_ID   Event_ID    Date
1           3           2017-05-05
1           3           2017-05-09
1           2           2017-05-10
2           1           2017-05-04
2           3           2017-05-15
我对如何进行如下查询感兴趣:

  • 在三天内找到所有在Krusty Krab吃过饭的人 拜访海绵宝宝

  • 找到所有吹过泡泡的人,然后去看海绵宝宝,然后 按特定顺序再次吹出气泡(其他干预事件 你没事)

  • 找到所有吹过泡泡的人,然后去看海绵宝宝,然后 按特定顺序再次吹出气泡(其他干预事件 你不好)

  • 查找所有曾在Krusty Krab一年内至少吃过5次的人 7天


这类查询有名称吗?有没有通用的SQL策略来处理类似的查询?我特别感兴趣的是如何快速执行类似的查询。有没有专门的数据库或索引可以帮助提高此类查询的性能?

有这么多不同的方法来处理此类问题。。。因为你的评论只是在寻找逻辑方向。。。我希望这有帮助,也有意义

在拜访海绵宝宝后的3天内找到所有曾在Krusty Krab吃过东西的人。

你可以通过选择对Krusty Krab的所有访问,然后查看该人是否在检查他们是否在3天前访问过海绵宝宝的查询中
。提示:
。。。其中PersonId IN(选择PersonId WHERE DATEDIFF(day、SpongebobVisit、KrustyKrabVisit)>=3)

找到所有吹过泡泡的人,然后拜访海绵宝宝,然后按照特定顺序再次吹泡泡(其他干预活动也可以)。

您可以创建三个子查询表。。。吹泡泡,拜访海绵宝宝,吹泡泡。然后,在链中加入
JOIN
,其中每个
JOIN
s的日期大于最后一个事件。由于
内部联接
,它将只返回那些事件按顺序排列的行

找到所有吹过泡泡的人,然后去看海绵宝宝,然后按特定顺序再次吹泡泡(其他干预事件不合适)。

按人员和日期对表格进行排序,并查看
LEAD
LAG
功能

在7天的时间内,找到所有曾经在Krusty Krab至少吃过5次的人。

看这里:

是否有专门的数据库或索引可以帮助提高此类查询的性能?

对于这些类型的查询,ID上的标准索引应该足够了


编辑:我不是在推广,但是这里有一位用户写了一本书,叫做《SQL反模式》,这本书深入探讨了解决类似这样有趣问题的正确方法。他通常展示一种人们通常会使用的方法,然后是正确的方法。

这些查询在功能上不够接近,没有一个通用的基于函数的名称或策略。至少没有我能想到的

它们的使用可能非常接近,可以称它们为“数据挖掘”或“营销”查询。然而,如果这就是为什么你要问的话,我怀疑这两种方法在谷歌搜索通用策略时是否有用


如果您有兴趣让不太懂sql的用户创建和运行这样的即席查询以及他们可能提出的任何其他查询,您可能会考虑为他们提供一个非规范化视图,甚至是一个包含他们认为想要使用的每个维度的多维数据集。

看起来像是家庭作业或类似内容。向我们展示您已尝试的内容-添加预期结果以及不同的查询尝试。同时标记您正在使用的dbms。您必须说“Ravioli,Ravioli,给我查询表。”此外,提供您尝试过的内容。如果他正在寻找如何编写这些查询,请同意前面的评论。不同意,如果他试图理解这些类型的查询——这就是这个问题对我的理解。我不需要查询示例的SQL代码,只需要回答我的问题。我处理医院数据,我们通常对寻找具有特定程序/诊断序列的患者感兴趣。我知道如何在代码中进行这些比较,但需要一种更省时的方法,老实说,我不知道从哪里开始。