查询带或不带日期约束的事件序列

时间:2017-09-01 13:50:05

标签: 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   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

我对如何进行这样的查询感兴趣:

  • 查找所有在3天内吃过Krusty Krab的人 访问海绵宝宝。

  • 找到所有曾经吹泡泡的人,然后访问了SpongeBob 以特定顺序再次吹泡泡(其他干预事件 没事)。

  • 找到所有曾经吹泡泡的人,然后访问了SpongeBob 以特定顺序再次吹泡泡(其他干预事件 不行。)

  • 查找所有曾在Krusty Krab吃过至少5次的人 7天的时间。

此类查询是否有名称?是否有可用于处理这类查询的通用SQL策略?我对如何快速完成这些查询特别感兴趣。是否有任何专门的数据库或索引可以帮助提高这类查询的性能?

2 个答案:

答案 0 :(得分:1)

有这么多不同的方式来做这样的事情...因为你的评论只是寻找逻辑方向......我希望这有帮助并且有意义。

查看所有在访问SpongeBob后3天内吃过Krusty Krab的人。

您可以通过选择对Krusty Krab的所有访问来实现此目的,然后查看该人是否IN查询他们是否在3天前访问过Spongebob。提示:... WHERE PersonId IN (SELECT PersonId WHERE DATEDIFF(day, SpongebobVisit, KrustyKrabVisit) >= 3)

查找所有曾经吹泡泡的人,然后访问了SpongeBob,然后按特定顺序再次吹气泡(其他干预事件都可以)。

您可以创建三个子查询表...吹泡泡,访问海绵宝宝和吹泡泡。然后JOIN在链中,其中每个JOIN s的日期大于最后一个事件。由于INNER JOIN,它只返回那些事件顺序排列的行。

查找所有曾经吹泡泡的人,然后访问了SpongeBob,然后按特定顺序再次吹气泡(其他干预事件不合适)。

按人和日期对表格进行排序,并查看LEADLAG函数。

查找所有在7天内至少吃过Krusty Krab 5次的人。

请看这里:Sql Query to find A series of dates that occur within 5 minutes of each other?

是否有任何专门的数据库或索引可以帮助提高这类查询的效果?

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

编辑:我没有推广,但是这里有一位用户写了一本名为" SQL Antipatterns"这真的潜入了解决这样有趣问题的正确方法。他通常表现出一种人们通常会这样做的方式,然后是正确的方式。

答案 1 :(得分:0)

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

他们可能在使用中足够接近,称他们为“数据挖掘”或“营销”查询。但是我怀疑这些在谷歌搜索通用策略中是否有用,如果这就是你问的原因。

如果你有兴趣让那些精通sql的用户创建和运行这样的ad-hoc查询以及他们可能提出的任何其他问题,你可能会考虑给他们一个非规范化的视图甚至是每个维度的多维数据集可以想到想要使用。